Polymer
次の理由により、そのままでは観察を行いません。
Object.observe
サポートはユビキタスではなく、ダーティ チェックは高価です。
Object.observe
それ自体が高価かもしれません。
想定される解決策
自分で変更をキャッチしnotifyPath
、 、this.fire('global-foo-changed', {path: 'globalFoo.bar', value:...}
、this.set
および を呼び出しますthis.push
。
それらはすべて、対応する非バブリング (キャプチャ)globalFoo-changed
カスタム イベントをディスパッチします (必要な場合のみ)。
イベントが要素global-foo-changed
のみに影響するのはなぜですか?this
global-foo-changed
イベントがキャプチャされます (非バブリング)。
- ポリマー要素は、デフォルトでバブリング イベントをリッスンします。
- 何らかの理由で、これらのキャプチャ リスナーは、(子からではなく) 同じ要素からディスパッチされたバブル イベントをキャプチャします。codepen のデモ。
この動作でポリマーにパッチを当てることができます (どのように機能するかわかりません):
SharedGlobalsBehavior = {
properties: {
globalFoo: {
type: Object,
notify: true,
value: globalFoo
}
},
created: function() {
window.addEventListener('global-foo-changed', () => {
if (!event.detail || !event.detail.path)
return; // Property initialization.
this.notifyPath(event.detail.path, event.detail.value);
},/* if capturing */ true);
}
};
箱から出して観察しない理由
...命令型コードでオブジェクトのサブプロパティを直接変更する必要がある場合があります。最も一般的なユースケースでクロスプラットフォームで最高の起動およびランタイムパフォーマンスを達成するために、Object.observe やダーティチェックなどのより洗練された監視メカニズムを避けるため、オブジェクトのサブプロパティを直接変更するには、ユーザーからの協力が必要です。
具体的には、Polymer は、そのような変更をシステムに通知できるようにする 2 つのメソッドを提供します。