你在这里混合了两件事:绑定与观察者不一样。你不能绑定到@ @ 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 />');
});
}
})
很好的解释, 谢谢! – KOGI 2013-07-07 22:58:22