{{input value = someProperty}}神奇地定义了一个属性?我可以用<input {bind-attr =“”value =“newTitle”}} =“”/>来实现相同的目标吗?

时间:2014-05-30 22:30:26

标签: ember.js

所以这是这个例子:http://emberjs.com/guides/getting-started/creating-a-new-model/

 {{input type="text" id="new-todo" placeholder="What needs to be done?" 
          value=newTitle action="createTodo"}}

此助手使用newTitle属性。此属性未在JS代码中的任何位置定义,仅在模板中定义(在{{input}}帮助程序中是特定的)。但是这个属性可以在JS代码中访问:

Todos.TodosController = Ember.ArrayController.extend({
  actions: {
    createTodo: function() {
      // Get the todo title set by the "New Todo" text field
      var title = this.get('newTitle');
      // ...
    }
  }
});

我决定在此输入上添加其他操作。但是{{input}}帮助器似乎不接受其他操作。所以我决定用它的替代品替换它:

<input type="text" id="new-todo" placeholder="What needs to be done?" 
          value=newTitle {{action createTodo}}>

我还没有添加其他操作。但是这一变化导致createTodo行动失败! this.get('newTitle') getter返回undefined

以下是演示:http://jsbin.com/ImukUZO/205/edit请按照此处列出的步骤查看问题。

问题是:

  1. {{input value=newTitle action="createTodo"}}笨蛋是否会做<input value=newTitle {{action createTodo}}>不做的魔术?创建newTitle属性?
  2. 这种差异记录在哪里?请提供链接。
  3. 创建'newTitle'属性在哪里?路线?视图?控制器?模型?
  4. 有没有办法用<input value=newTitle {{action createTodo}}>实现相同的行为,而没有在JS中明确定义newTitle属性(就像{{input value=newTitle action="createTodo"}}可能的那样)?
  5. 奖金问题5:如何将额外事件挂钩到{{input}}助手?例如,我可以执行<input {{action foo}} {{action bar on="mouseEnter"}}>,我如何对{{input}}执行相同操作?

1 个答案:

答案 0 :(得分:1)

  

{{input value = newTitle action =&#34; createTodo&#34;}} heplper是否做了一些   不做的魔法?   创建newTitle属性?

输入助手(在本例中)基本上是{{view Ember.TextField value=someProperty}}的语法糖。这与<input {{bind-attr value="someProperty"}}>不同,因为bind-attr只是单向的(data - &gt; dom)。 Ember.TextField包含TextSupport Mixin,它观察相关事件以进行双向绑定

  

这种差异记录在哪里?请提供链接。

我不知道。我怀疑文档中的所有示例都使用输入助手而不是bind-attr,原因如下。

  

&#39; newTitle&#39;创建的属性?路线?视图?控制器?模型?

当你&#34;创造&#34;通过绑定到尚不存在的属性的属性,它将始终在当前上下文中创建。要查看当前上下文,请在模板中放置{{this}}(或{{log this}}或{{debugger}} - 这会暂停&#34;此&#34;设置为上下文)。这通常是 控制器。

  

有没有办法在没有在JS中明确定义newTitle属性的情况下实现相同的行为(就像{{input value = newTitle action =&#34; createTodo&#34;}}}一样?

不,要对输入进行双向绑定,需要使用输入助手或Em.TextField或子类。