在create()上不调用Observer

时间:2012-07-10 11:40:08

标签: ember.js

我有Ember.Mixin观察其中一个属性(此处为bar.baz)。

我已扩展此Mixin并在bar.baz参数中设置.create(),但我的观察者未被调用。

这是我的代码:

App.FooMixin = Ember.Mixin.create({
    barBazDidChange: function() {
        console.log('barBazDidChange'); // never called
    }.observes("bar.baz")
});

App.Foo = Ember.Object.extend(App.FooMixin);

App.fooObject = App.Foo.create({
    bar: Ember.Object.create({
        baz: "ember"
    })
});​

相关的jsfiddle:http://jsfiddle.net/aMQmn/

我当然可以像init()方法一样调用观察者,但是我想知道是否有更好的解决方案(或者这个解决方案是否是正确的方法):

App.FooMixin = Ember.Mixin.create({
    init: function() {
      this._super();
      if (this.getPath('bar.baz')) { 
        this.notifyPropertyChange('bar.baz');
      }
    }
});

2 个答案:

答案 0 :(得分:3)

所以在7天内没有回答......我会做什么而不是在创建时传递属性是链接创建和设置属性,如下所示:

App.fooObject = App.Foo.create().set('bar', Ember.Object.create({baz: "ember"}));​

如果它不够令人满意,也许你可以在github上的ember项目中发布一个问题: https://github.com/emberjs/ember.js/issues

答案 1 :(得分:3)

正确的解决方案是覆盖init方法(确保调用this._super())并在那里调用函数。正如其他人所指出的那样,观察者没有开火,因为价值实际上并没有改变。有一些关于使create更像setProperties的行为的讨论会让这个问题变得毫无问题。