プロジェクトを Ember 1.13 にアップグレードしようとしていますが、componentの新しい属性の動作について、特にそれらを観察する必要がある場合に少し混乱しています。
たとえば、私のテスト コンポーネントは、外部から渡されるパラメーターであるbarを観察します。Ember の新しい Glimmer エンジンでは、属性が変更されるとコンポーネントが再レンダリングされることを私は知っています。私が理解できないのは、 attrs.barを観察すると、オブザーバーもその時点で起動されるということです(私はbarを変更していません!)。しかし、バー自体を観察すれば問題ありません。
サンプルコード:
HTMLバー:
{{test-cpnt foo=foo bar=bar}}
<input type="button" {{action 'tap'}} value="tap"/>
コントローラ:
foo: 1,
bar: 100,
actions: {
tap: function(){
this.set('foo', this.get('foo')+1);
}
}
成分:
App.TestCpntComponent = Ember.Component.extend({
barObv1: Ember.observer('bar', function(){
console.log('bar observer is fired!');
}),
barObv2: Ember.observer('attrs.bar', function(){
console.log('attrs.bar observer is fired!');
}),
});
ボタンをタップしてfooの値を変更すると、 barObv2もトリガーされます。デモ用の jsbin を作成しました: https://jsbin.com/qiwivu/2/edit?js,console,output
オブザーバーがトリガーされた理由を誰かが知っていますか?