Polymer 聚合物,请观察全球路径
在Polymer 聚合物,请观察全球路径,polymer,globals,object.observe,Polymer,Globals,Object.observe,在Polymer 1.0中,您可以删除{{{localPropFoo.bar},如果使用this.set('localPropFoo.bar','new value'),将观察bar的变化以更新其值 但若要将模板绑定到无法控制的外部对象,该怎么办?例如,此{{window.globalFoo.bar}不会绑定到bar更改,因为外部代码不依赖于Polymer,也不调用this.set 使用对象。手动观察需要额外的代码,并且在FireFox中不起作用(为了救援而对对象进行脏检查) 我想知道将数据绑
Polymer 1.0
中,您可以删除{{{localPropFoo.bar}
,如果使用this.set('localPropFoo.bar','new value'),将观察bar
的变化
以更新其值
但若要将模板绑定到无法控制的外部对象,该怎么办?例如,此{{window.globalFoo.bar}
不会绑定到bar
更改,因为外部代码不依赖于Polymer
,也不调用this.set
使用对象。手动观察
需要额外的代码,并且在FireFox中不起作用(为了救援而对对象进行脏检查)
我想知道将数据绑定到您无法控制的外部对象的惯用方法是什么。
Polymer
不会进行开箱即用的观察,因为:
Object.observe
支持并不普遍,脏检查的费用也很高对象。观察
本身可能很昂贵notifyPath
,this.fire('global-foo-changed',{path:'globalFoo.bar',value:…}
,this.set
和this.push
它们都会发送相应的非冒泡(捕获)
globalFoo changed
custom事件(仅在需要时)
为什么我的global foo changed
事件只影响此元素?
global foo changed
正在捕获事件(非冒泡)
默认情况下,聚合元素侦听冒泡事件
出于某种原因,这些捕获侦听器捕获从同一元素(而不是从其子元素)发送的气泡事件
您可以用这种行为修补聚合物(我不明白它是如何工作的):
为什么没有开箱观察
…有时命令式代码需要直接更改对象的子属性。由于我们避免使用更复杂的观察机制,如object.observe或dirty Check,以便在最常见的用例中实现跨平台的最佳启动和运行时性能,因此直接更改对象的子属性需要coo来自用户的操作
具体而言,Polymer提供了两种方法,允许将此类更改通知给系统:notifyPath(路径,值)和set(路径,值),其中path是标识路径(相对于主机元素)的字符串
您是否尝试过iron signals?它可以侦听任何iron signal-*事件,而不管它在DOM中的位置如何。惯用的方法是不绑定到您无法控制的外部对象。您是否使用其他库来设置它?如果您控制整个应用程序,那么应该不需要它。observe-js是您唯一的助手,但它是一种笨拙的方法@Andrey我使用我自己的库,我不想依赖于Polymer,但我可以让它以某种方式发出事件,也许通过Node的EventEmitter
@ilyaigpetrov,你可以使用原生JS事件
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);
}
};