您在这里混合了两件事:绑定与观察者不同。你不能绑定到某个东西。@each.name,你需要绑定到数组并观察@each。绑定是 2 个值之间的连接,@each 并不是真正的值,它是一种特殊语法,用于告诉观察者(或计算的属性依赖项)您希望依赖集合中每个元素的属性。
另一个问题是,如果在设置值之后添加观察者,它不会触发,因为值已经设置(即没有更改)。在您的示例中, App.Person.find(1) 立即返回对象,而 person.children 也这样做 - 它立即返回数组,稍后将填充数据。所以当你运行 addObserver 时,children 已经设置好了,只有它的内容会发生变化(这就是长度观察器正确触发的原因)。
这是一些更改的小提琴: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="modelData.@each.name"}}
{{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 />');
});
}
})