2015-02-05 43 views
1

我始终认为.observes('someProperty').property('someProperty')的工作原理完全相同,只是前者用于触发函数调用,后者用于保持对象属性为最新。计算vs观察Ember中的控制器

但现在我遇到了问题。我的控制器代码如下所示:

_logChange: function(){ 
    console.log('model array observer fired'); 
}.observes('[email protected]'), 

statsData: function(){ 
    console.log('statsData being updated'); 
    ... 
    return someArray; 
}.property('[email protected]') 

观察员和计算性能都手表的型号@每个但出于某种原因,在每一个模型变化观测火灾和财产只更新两次,然后神秘地会耗尽。statsData在初始页面加载时计算一次,并且在第一次路径转换时计算一次,然后在这之后,没有任何转换(其基础model中的更改)会影响转换。

这是怎么回事?他们不应该以同样的方式回应变化吗?

请注意,我的上午使用我的模板中的statsData属性。

回答

2

2009年,由于灰烬IRC可爱的人,我能弄明白。问题是,我经过statsData一个组件,就像这样:{{common-statistics values=statsData}}和分量,我有这个功能:

_validateValues: function(){ 
    var values = this.get('values'); 
    if(!values || !Ember.isArray(values) || values.length === 0) 
    { 
     this.set('values',[]); 
    } 
}.on('willInsertElement') 

是,你可以看到,设置values如果不是的成分是什么期待。不幸的是,这也影响了控制器上的statsData,这要归功于this JavaScript language feature。通过在组件中设置statsData,我打破了控制器上的计算属性。

所以它从来都不是Ember的问题。我只是没有意识到Ember对象上的对象属性的行为方式与他们在“常规JavaScript对象”上的行为相同。

+0

我想补充一点,我没有在'values'的计算属性中定义的setter逻辑,这就是为什么计算的属性被打破;它被香草JS阵列完全覆盖。记得,在计算属性中设置逻辑! – IGNIS 2015-02-19 16:14:41

1

观察员立即开火,计算的火作为运行循环的一部分,并计划以去抖动的方式。目前您所看到的只是您向集合中添加或删除项目,而不是集合中某个项目的属性是否已更改。如果你想观看一个特定的属性,你需要指定它。

statsData: function(){ 
    console.log('statsData being updated'); 
    ... 
    return someArray; 
}.property('[email protected]') 

,如果你只是想观看集合改变你应该只使用[]

statsData: function(){ 
    console.log('statsData being updated'); 
    ... 
    return someArray; 
}.property('model.[]') 
+0

感谢您的回答,我不知道关于观察员立即发射与计算器在运行循环中发射的情况。我也不知道@each和[]之间的真正区别。好的信息!不过,我确实发现了自己的问题,但事实证明,这根本不是Ember问题。我发布了一个答案。 – IGNIS 2015-02-05 16:26:09