Ember.js 1.13:观察组件传入属性的正确方法?

Ember.js 1.13:观察组件传入属性的正确方法?,ember.js,ember-components,ember-observable,Ember.js,Ember Components,Ember Observable,我正试图将我的项目升级到Ember 1.13,我对组件的新属性的行为有点困惑,尤其是当我不得不观察它们时 例如,我的测试组件观察条,这是从外部传递的参数。我知道在余烬的新微光引擎中,组件的属性一旦改变就会重新渲染。我不知道的是,如果我观察attrs.bar(我没有修改bar),观察者也会在那时被解雇。但是如果我观察一下条本身,它就会好起来 示例代码: HTMLBar: {{test-cpnt foo=foo bar=bar}} <input type="button" {{action

我正试图将我的项目升级到Ember 1.13,我对组件的新属性的行为有点困惑,尤其是当我不得不观察它们时

例如,我的测试组件观察,这是从外部传递的参数。我知道在余烬的新微光引擎中,组件的属性一旦改变就会重新渲染。我不知道的是,如果我观察attrs.bar(我没有修改bar),观察者也会在那时被解雇。但是如果我观察一下条本身,它就会好起来

示例代码:

HTMLBar:

 {{test-cpnt foo=foo bar=bar}}
 <input type="button" {{action 'tap'}} value="tap"/>
组成部分:

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:


有人知道为什么会触发观察者吗?

好吧,你不必使用观察者,因为你在Ember 1.13中,你可以使用每当属性更新时触发的
didUpdateAttrs

Ember.Component.extend({
....
 didUpdateAttrs({oldAttrs, newAttrs}) {
   let oldBar = get(oldAttrs, 'bar.value');
   let newBar = get(newAttrs, 'bar.value');

   if (oldBar !== new Bar) {
      // your logic here
   }
 }
....
});
如果您打算使用observer,您可以观察以下更改

barDidChange: Ember.observer('bar', function(){ 
 console.log('bar observer is fired!');
});

监听
attrs.bar
将无法正常工作,每当更新属性(包括init)时,attrs每次都会发生变异,从而导致观察者触发,有关详细信息,请参阅
attrs
应与
角括号组件一起使用。这里有一个很好的解释,为什么我们不应该对卷曲组件使用attrs。

您的jsbin似乎对我不起作用,但我将其移植到twiddle以更好地理解您的问题:
barDidChange: Ember.observer('bar', function(){ 
 console.log('bar observer is fired!');
});