在emberJS中,我有一个带有对象属性的模型,称为样式。我可以使用test.setPath('style.a')设置其属性。我试图观察样式对象,但是观察回调未触发。

您可以看到代码here

最佳答案

对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.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');
}


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

09-17 16:52
查看更多