2017-07-24 103 views
2

我正在創建一個簡單的Todo應用程序,因爲我在探索EmberJS v2.14。我想建立手動內嵌編輯功能 - 用戶將雙擊待辦事項行項目文本跨度,打開輸入字段。然後,用戶將編輯待辦事項,將雙向綁定到後臺對象。然後當焦點丟失時,應用程序將重新關閉輸入字段到新編輯的文本。Ember:在焦點輸出字段上調用輸入字段與參數

以下代碼片段位於{{each}}區塊幫助程序內,它與差不多有效。

{{#unless todo.isOpenForEdit}} 
    <span {{action 'openForEditing' todo on='doubleClick'}}>{{todo.text}}</span> 
{{else}} 
    {{input type="text" value=todo.text action='closeForEditing' on='focus-out'}} 
{{/unless}} 

工作件

  • 我可以雙擊進入編輯模式(即openForEditing()正確調用與寫入參數。)
  • 操作處理程序closeForEditing()正確調用當焦點從輸入字段丟失。

件不工作

  • 我不知道如何待辦事項對象模型作爲參數傳遞,所以 該closeForEditing()處理程序可以做設定 isOpenForEdit的適當的工作回假。

-

Q)我如何通過一個參數一個行動處理器與輸入輔助工作時?

Q)有沒有不同的方法可以達到我的目標?

回答

1

咖喱todo你可以通過你的行動方式如下:

{{input type="text" value=todo.text focusOut=(action 'closeForEditing' todo)}} 
+0

謝謝,我很難找到我需要的文檔。 –

+2

@MichaelR這種類型的動作被稱爲閉包動作,並在[本節]中進行了介紹(https://guides.emberjs.com/v2.14.0/components/triggering-changes-with-actions/#toc_passing-arguments )的指南。 –

1

您可以通過創建閉合動作動作助手

{{input type="text" value=todo.text action=(action 'closeForEditing' todo) on='focus-out'}} 
+0

是,這種替代工作對我來說太! –

+0

其實我只是通過currying所需的參數來使用你的例子,但是你不需要在='focus-out'上做'action =(action'closeForEditing'todo)',而只需說'focusOut =(action'closeForEditing'todo )'就像上面提到的答案一樣。 – kumkanillam

+0

@MichaelR在你的情況中,你正在迭代'todo',所以我相信這將是特定組件的屬性,所以你可以在closeForEditing函數中用'let todo = this.get('todo')'來代替傳遞。 – kumkanillam