2016-12-05 7 views
1

以下のサンプルコードを参照してください。 は私がパフォーマンスを向上させるためdidReceiveAttrsフックの代わりに、observers経由value性質の変化を観察したいコンポーネントmy-text-box変更可能なセルの場合、didReceiveAttrsフックで実際のattr値を取得する方法

my-text-box.hbs

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

を持って考えます。

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には公開されていません。そして私が考えているのは、おそらくEmbernewAttrsoldAttrsの両方に、mutableオブジェクトの代わりに直接値を持つように変更する必要があるということです。

誰かがそれを処理する方法はありますか?ありがとう!

+0

'newAttrs'と' oldAttrs'はパブリックAPIではありません:X – locks

+0

'observers'を置き換えるのは難しいので、1つのプロパティが変更されているかどうかを知る必要があります。 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が 'new'値と' old'値を抽出すれば、余分なコストをかけずに簡単に比較できます。 Emberのメンテナーはこれを見て、それを考慮することができます。 – shijistar

1

エンバーコンポーネントのライフサイクルフック引数は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を使用することができます。

関連する問題