Javascript 从Ember.js中的嵌套对象计算属性

Javascript 从Ember.js中的嵌套对象计算属性,javascript,ember.js,Javascript,Ember.js,我需要在我的Ember.js Handlebar模板中显示方法的结果。据我所知,我必须使用计算属性来执行此操作。我遇到的问题是,属性依赖于一个嵌套对象,在更改/设置时,该对象似乎不会触发更改事件,因为我只是更改其内部结构。以下是我的情况的简短示例: App.Foo = Ember.Object.extend({ prop: { fizz: {} }, init: function() { var prop = this.get("prop

我需要在我的Ember.js Handlebar模板中显示方法的结果。据我所知,我必须使用计算属性来执行此操作。我遇到的问题是,属性依赖于一个嵌套对象,在更改/设置时,该对象似乎不会触发更改事件,因为我只是更改其内部结构。以下是我的情况的简短示例:

App.Foo = Ember.Object.extend({
    prop: {
        fizz: {}
    },

    init: function() {
        var prop = this.get("prop");
        prop.fizz.buzz = "foobar";
        this.set("prop", prop); // This doesn't seem to fire a change event
    },

    handlebarsValue: function() {
        var prop = this.get("prop");
        // ...
        // compute this property from the properties of `prop`
        // ...
        return prop.fizz.buzz;
    }.property("prop")
});
模板:

<p>handlebarsValue: {{model.handlebarsValue}}</p>
handlebarsValue:{{model.handlebarsValue}


有没有办法强制更新计算属性?有更好的方法吗?我是否误解了“余烬方式”?

属性willchange方法似乎可以提醒余烬更改属性。我仍然不确定这是否是最理想的解决方案,但它适合我的情况

App.Foo = Ember.Object.extend({
        prop: {
            fizz: {}
        },

        init: function() {
            var prop = this.get("prop");
            this.propertyWillChange("prop");
            prop.fizz.buzz = "foobar";
            this.set("prop", prop); // This doesn't seem to fire a change event
        },

        handlebarsValue: function() {
            var prop = this.get("prop");
            // ...
            // compute this property from the properties of `prop`
            // ...
            return prop.fizz.buzz;
        }.property("prop")
    });

您可以重写Ember.Object.set(key,value)方法,并通知属性观察员您的属性已更改

// http://emberjs.com/api/classes/Ember.Object.html#method_set
set: function(key, value) {
  this._super(key, value);

  // Are we updating any nested attributes of our property 'prop'?
  if (key.indexOf('prop.') > -1) {

    // then notify property observers
    this.notifyPropertyChange('prop');
  }
}
JSBin演示: