2017-07-24 150 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