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);
      }
    };