0

这是一个小提琴

该模板有多个具有不同绑定属性的相同 subView 实例。您可以看到这些绑定属性何时在其观察者上触发事件。请注意,子视图 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="view.person.children.@each.name"}}
{{view App.SubView identifier="D" modelDataBinding="view.person.children.length"}}

所以,两部分的问题:

  1. 为什么 B 或 C 不开火?
  2. 绑定到此 Person 模型的子代的正确方法是什么?
4

1 回答 1

1

您在这里混合了两件事:绑定与观察者不同。你不能绑定到某个东西。@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 />');
        });
    }
})
于 2013-07-07T22:51:09.370 回答