使用setPath观察对ember对象的所有更改

时间:2012-03-09 14:29:25

标签: javascript ember.js

在emberJS中,我有一个名为style的对象属性的模型。我可以使用test.setPath('style.a')设置它的属性。我正在尝试观察样式对象,但我的观察回调没有触发。

您可以看到代码here

1 个答案:

答案 0 :(得分:5)

这对Ember观察员如何工作的基本误解是一个常见的错误。在您的示例中,您在视图test中有以下内容:

...

style : Ember.Object.create({
    a:4,
    b:2
}),
setStyle : function(key, val){
    var style = this.get('style');
    style[key] = val;
    this.set('style', style);        
},

...

test.style属性指向Ember.Objecttest.setStyle()正在更改Ember.Object上给定属性的值。一个常见的错误是认为将属性重置为同一个对象将会调用该行上的任何观察者:this.set('style', style)。好吧,这不是Ember观察员的工作方式。当属性的实际值发生变化时,Ember中的观察者会自动触发。将style属性设置为自身不会更改style指向的对象,因此它不会更改属性的值(实际上该代码根本不执行任何操作)。在这种情况下,您似乎需要手动告诉Ember style属性已更改。你可以致电notifyPropertyChange()来做到这一点。

查看setStyle的以下修改代码:

setStyle : function(key, val){
    var style = this.get('style');
    style.set(key, val); // You should always use `.get()` and `.set()`

    this.notifyPropertyChange('style');
}

这将导致您的观察者开火。