2016-12-05 57 views
1

请参阅下面的示例代码。由于我有一个组件my-text-box如何在didReceiveAttrs钩子中获得真实的attr值,如果它是可变的单元格

my-text-box.hbs

{{my-text-box value=modelName}} 

我想通过didReceiveAttrs挂钩,而不是observers观察value属性的变化有更好的表现。

my-text-box.js

didReceiveAttrs: function(args) { 
    if (args.oldAttrs == null) { 
     // This is the initial render, but I don't need to anything here. 
    } else if (args.newAttrs.value != args.oldAttrs.value) { 
     // supposed `value` was changed from outside, I can do something here... 

     // BUT, `args.newAttrs.value` is not always the prop value, 
     // `Ember` would automatically wrap it with `{{mut}}` helper. 
     // The data structure would be: 
     // { 
     // value: value, 
     // update: function (val) { 
     //  source.setValue(val); 
     // } 
     // } 
    } 
} 

我想的是,我没有去关心的Attr值是否为mutable细胞或不,我应该得到的方式,总能得到真正的价值。我看到有一个HTMLBars hookember-htmlbars/hooks/get-value但它没有暴露给公共API。而我在想的是,也许Ember应该将newAttrsoldAttrs都改为具有直接值而不是那些mutable对象。

有没有人有办法处理?谢谢!

+0

'newAttrs'和'oldAttrs'不是公共API:X – locks

+0

所以很难替换'observers',我需要知道一个属性是否被更改。 http://emberjs.com/api/classes/Ember.Component.html#event_didReceiveAttrs – shijistar

回答

0

我的建议是保存自己以前的值,然后比较:

export default Ember.Component.extend({ 
    _previousAttr: null, 

    didReceiveAttrs() { 
    this._super(...arguments); 
    if (this.get('_previousAttr') !== this.get('attrName')) { 
     this.set('_previousAttr', this.get('attrName')); 
     // do your thing 
    } 
    } 
}); 
+0

感谢您的建议。这对我来说很有意义,我也是这样做的。但我必须为我需要观看的所有房产制作一个“影子”,这是很多额外的工作。如果Ember提取“新”值和“旧”值,那么我可以轻松地比较它们,而无需任何额外的成本。希望Ember维护者可以看到这一点,并考虑它。 – shijistar

1

灰烬组件的生命周期挂钩ARG游戏根据RFC#191弃用。

因此,这将是更好的做这样的事:

Ember.Component.extend({ 
    didReceiveAttrs() { 
    let oldAttrs = this.get('_previousAttrs'); 
    let newAttrs = this.get('newAttrs'); 

    if (oldAttrs && oldAttrs !== newAttrs) { 
     this.map.move({ from: oldAttrs, to: newAttrs }); 
    } 

    this.set('_previousAttrs', newAttrs); 
    } 
}); 

或者,也许你可以使用这个ember-diff-attrs addon一会儿。

相关问题