2015-06-16 365 views
2

我看到直接绑定到兄弟元素不再支持 - https://www.polymer-project.org/1.0/docs/migration.html#binding-to-sibling-elements结合兄弟元素

1.0作品的属性,但怎么样直接绑定到同级元素本身,例如建议的方法:

<template> 
    <x-publisher id="publisher"></x-publisher> 
    <x-subscriber publisher="{{$.publisher}}"></x-subscriber> 
</template> 

我在0.5中使用这个来访问方法的同级元素以及属性。有没有办法在1.0中做到这一点?一般来说这是不好的做法?

更新

基于瓦尔坦奥斯的评论我看了看铁元&看来你可以做这样的事情在x出版商的定义:在x

new Polymer.IronMeta({key: 'publisher', value: this}); 

然后用户定义你可以这样做:

this.publisher = (new Polymer.IronMeta()).byKey('publisher'); 

然而,你没有得到绑定系统的好处这 - 例如你不能使用观察者数组观察发布者对象的基于路径的属性更改。你可以直接设置一个对象观察者,但是比直接绑定到兄弟姐妹的旧0.5方法开始变得更加混乱。

了解这只是性能折衷的一部分,但要确认没有更好的方法!也很高兴知道绑定到全元素通常是性能问题。

+0

这是不是你想这样做(至少不是以这种方式)1.0。相反,请查看[iron-meta](https://elements.polymer-project.org/elements/iron-meta),这是1.0中共享DOM树中信息/方法的首选方式。这与[iron-validator-behavior](https://elements.polymer-project.org/elements/iron-validator-behavior)使用的模式相同,它允许您在元素/应用程序中的某处实例化数据验证器并使用其功能在别处通过指向它与各自的财产。 –

+0

另请注意,类似于铁元方法,您可以向引用其'this'对象的x-publisher元素添加'self'属性,然后使用'self'属性执行绑定。不确定绑定到整个元素的性能影响。 – max

回答

2

你可以做这样的事情:

<template> 
    <x-publisher id="publisher"></x-publisher> 
    <x-subscriber publisher="{{getElement('publisher')}}"></x-subscriber> 
</template> 
... 
getElement: function(name) { return this.$[name]; } 
+0

甜蜜,谢谢。但绑定似乎没有设置正确。在x-subscriber中,{{publisher.property}}的任何用法都不会更改x-publishers属性的更改,也不会有任何手动配置的观察者。这是一个错误? – max

+0

你不能通过一个元素,并期望它的绑定在替代范围内工作,这不是一个错误。 'x-subscriber'没有办法自动收听'publisher'的更新事件。 –

+0

好的,当我想通了,谢谢。只需在0.5中进行双重检查,我们就不能在这里使用声明性绑定,即{{publisher.property}},但是我们可以为传入的元素属性设置一个“观察”对象。如果仍然可用,会很好,我发现它非常有用。然而猜测它可能需要像Object.observe这样不再使用的东西? – max