我的架构结构如下:
App = {};
App.Outer = Ember.Object.extend({
inner: null,
quantity: 0,
count: function () {
var self = this, inner = self.get('inner');
return self.get('quantity') * inner.get('count');
}.property('nothing')
});
App.Inner = Ember.Object.extend({
count: 0
});
是的,'count'计算属性确实设置为依赖于完全不存在的属性'nothing'。但无论如何它似乎都得到了更新:
var o1 = App.Outer.create({
quantity: 2,
inner: App.Inner.create({count: 4})
});
console.log(o1.get('count')); // => 8
o1.get('inner').set('count', 5);
console.log(o1.get('count')); // => 10
o1.set('inner', App.Inner.create({count: 10}));
console.log(o1.get('count')); // => 20
我错过了什么吗?它知道在没有我告诉它依赖什么的情况下更新什么...不可能是对的,可以吗?我对Ember计算属性的误解是什么?
由于
答案 0 :(得分:7)
使用this.get('quantity')
,inner.get('count')
,你告诉它它依赖于什么。每次调用.get('count')
时,函数都将关闭并获取这些属性的当前值,从而返回最新结果。
当您将计算的属性计数绑定到其他位置时,.property()
部分会起作用。一个看法。当你这样做,然后对数量进行更改将自动重新计算计数,并且这个新值也将传播到你绑定计数的任何数值。
您可以在此处查看不同的操作:http://jsfiddle.net/tomwhatmore/6gz8x/
答案 1 :(得分:3)
从Ember 0.9.5开始,除非在它们上调用cacheable(),否则不会缓存属性值。 e.g。
...
count: function () {
var self = this, inner = self.get('inner');
return self.get('quantity') * inner.get('count');
}.property('nothing').cacheable()
...
有关更多背景信息,请参阅有关此GitHub问题的讨论:https://github.com/emberjs/ember.js/issues/38