0

Here's a Fiddle观察员缺少更新?

该模板包含具有不同绑定属性的相同子视图的多个实例。你可以看到这些绑定属性何时触发观察者的事件。请注意,子视图A和D触发器,但B和C从不这样做。

{{view App.SubView identifier="A" modelDataBinding="view.person.first"}} 
{{view App.SubView identifier="B" modelDataBinding="view.person.children"}} 
{{view App.SubView identifier="C" modelDataBinding="[email protected]"}} 
{{view App.SubView identifier="D" modelDataBinding="view.person.children.length"}} 

所以,2部分的问题:

  1. 为什么不B或C曾经火?
  2. 什么是绑定到这个Person模型的孩子的正确方法?

回答

1

你在这里混合了两件事:绑定与观察者不一样。你不能绑定到@ @ each.name,你需要绑定到数组并观察@each。绑定是2个值之间的连接,@each并不是一个真正的值,它是一种特殊的语法,用于告诉观察者(或计算出的属性依赖关系),您希望依赖于集合中每个元素的属性。

另一个问题是,如果在设置值后添加观察者,它将不会触发,因为该值已设置(即没有更改)。在你的例子中,App.Person.find(1)立即返回对象,person.children也是这样 - 它立即返回数组,它将在稍后填充数据。所以在你运行addObserver的时候,孩子已经被设置了,只有它的内容会被改变(这就是为什么长度观察者会正确地触发)。

下面是一些变化的小提琴:http://jsfiddle.net/drogus/6EVty/1/(我加observerPath和视图插入后置人),代码:

<script type="text/x-handlebars" data-template-name="main"> 
    {{view App.SubView identifier="A" modelDataBinding="view.person.first"}} 
    {{view App.SubView identifier="B" modelDataBinding="view.person.children"}} 
    {{view App.SubView identifier="C" modelDataBinding="view.person.children" observePath="[email protected]"}} 
    {{view App.SubView identifier="D" modelDataBinding="view.person.children.length"}} 
</script> 

和视图类:

SubView: Ember.View.extend({ 
    init: function() { 
     this._super(); 
     var observePath = this.get('observePath') || 'modelData'; 
     this.addObserver(observePath, this, function() { 
      document.write('trigger ' + this.get('identifier') + ': ', this.get('modelData'), '<br />'); 
     }); 
    } 
}) 
+0

很好的解释, 谢谢! – KOGI 2013-07-07 22:58:22