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