emberJSでは、私はstyleというオブジェクトプロパティを持つモデルを持っています。 test.setPath('style.a')
を使用してプロパティを設定できます。私はスタイルオブジェクトを観察しようとしていますが、私の観測コールバックは発砲していません。setPathを使用してemberオブジェクトに対するすべての変更を観察します
コードhereが表示されます。
emberJSでは、私はstyleというオブジェクトプロパティを持つモデルを持っています。 test.setPath('style.a')
を使用してプロパティを設定できます。私はスタイルオブジェクトを観察しようとしていますが、私の観測コールバックは発砲していません。setPathを使用してemberオブジェクトに対するすべての変更を観察します
コード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
が指しているオブジェクトは変更されないため、プロパティの値は変更されません(実際には何も行われません)。この場合、style
プロパティが変更されたことをEmberに手動で伝える必要があるようです。 notifyPropertyChange()
を呼び出すことでそれを行うことができます。これはあなたの観察者が発射するようになります
setStyle : function(key, val){
var style = this.get('style');
style.set(key, val); // You should always use `.get()` and `.set()`
this.notifyPropertyChange('style');
}
:setStyle
に対して次の変更されたコードで
ルック。