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

Ada*_*son 1 javascript ember.js

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

你可以在这里看到代码.

Roy*_*els 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);        
},

...
Run Code Online (Sandbox Code Playgroud)

test.style属性指向Ember.Object并且test.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');
}
Run Code Online (Sandbox Code Playgroud)

这将导致你的观察者开火.