为什么即使我没有指定其依赖项,计算属性也会更新?

时间:2012-02-08 23:18:56

标签: ember.js

我的架构结构如下:

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计算属性的误解是什么?

由于

2 个答案:

答案 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