获取聚合物母元素
Get polymer parent element
所以我已经使用Polymer大约一天了,我在措辞这个问题时遇到了麻烦,所以如果我的方法偏离了基础,请不要觉得有必要解决这个问题,而是指出我正确的方向。
我拥有的是自定义元素中的自定义元素,我希望子元素影响父元素的属性。 我正在采取的方法是创建一个单击处理程序,关闭 IIFE 中的父元素,然后将该处理程序传递给子组件。这样。。。
Polymer({
ready: function(){
this.superHandler = (function(p) {
return function() {
// "this" here will be the sub-component
p.title = this.title;
}
})(this);
}
});
父元素在其模板中使用它的地方,例如...
<polymer-element name="parent-element">
<template>
<sub-element on-click={{superHandler}} />
</template>
</polymer-element>
这(在我的真实代码中,尽管这里可能有拼写错误)适用于除 IE 以外的所有内容,我知道 IE 不受官方支持,但它非常接近,我不想放弃它。 我想避免的事情是重复引用parentNodes和shadowRoots,以获得我正在寻找的父节点。
编辑
我忘了提到它在IE中是如何失败的,以及为什么我想避免parentNode调用。 在IE中,当它专门调度聚合物.js的9131行的事件时,变量"method"和obj[method]中的引用是IE中的字符串,因此没有方法适用。 我想避免使用parentNode的原因是因为调用者不是直接父节点,所以我不想在找到正确的父节点之前继续获取parentNodes,因为当我可以命名变量时,代码更容易理解。
编辑 2
我现在要做的(因为它在IE9中工作),尽管我保留了更好的答案的问题,即继续使用IIFE,返回一个接受子参数的函数。 然后子项将通过查询选择器找到感兴趣的父项。 这意味着孩子必须预先了解父母和呼叫方法,这并不理想,但是......即。
所以家长将其设置为...
Polymer('parent-element', {
ready: function(){
this.superHandler = (function(p) {
return function(child) {
p.title = chile.title;
}
})(this);
}
});
孩子必须通过查询选择器获取它,比如通过"父元素"并知道名称"superHandler"(而不是实际名称)
Polymer('child-element',{
clickHandler: function(){
var p = document.querySelector('parent-element').superHandler;
p(this);
}
});
更好的主意?
您可以使用自己的事件在元素之间传递数据。
父组件:
<polymer-element name="parent-element">
<template>
<!-- ... -->
<sub-element></sub-element>
</template>
<script>
Polymer({
ready: function() {
this.addEventListener('eventFromChild', this.myAction);
},
myAction: function(event) {
console.log(event.detail);
},
});
</script>
子组件:
<polymer-element name="sub-element" attributes="foo bar">
<template>
<!-- ... -->
<button on-click="{{passParams}}">Send</button>
</template>
<script>
Polymer({
ready: function() {
this.foo = 'abc';
this.bar = '123';
},
passParams: function() {
this.fire('eventFromChild', { foo: this.foo, bar: this.bar });
},
});
</script>
这是访问 Javascript 中父元素的简单方法。这适用于个人作品(聚合物 0.5 - 如评论中所述,1.0 中的情况有所不同)。未在IE上测试,但在我看来,这是一个简单的解决方案:
Polymer('sub-element', {
ready: function(){
this.parentNode;
}
});
感谢您的自定义事件建议。 这让我回过头来再次查看核心元素以找到这一点。
然后我只需要添加一个
<core-signals on-core-signal-my-event="{{myEventHandler}}"></core-signals>
触发一个名称为(在本例中)为"my-event"的"核心信号"事件,并在父级上创建一个方法"myEventHandler",例如
Polymer({
myEventHandler: function(e,detail,sender) {...}
})
由于组件的性质,我对以这种方式访问 parentNode 犹豫不决。如果您需要样式,则可以使用:host()
css规则来使用它。恕我直言,除非您有充分的理由,否则联系父元素似乎很恶心。为什么不使用自定义事件或中间商店,如localStorage
?
另请查看"Web 组件的'黄金标准'清单",以获取有关最佳实践的其他帮助。
- 如何在模板聚合物中使用元素函数
- 聚合物:在不同的视图模型中多次使用元素
- 如何动态创建聚合物元素
- 如何使用javascript独立地为聚合物自定义元素的每个实例的lightdom设置样式
- 造型:主机的聚合物元素与Javascript
- 如何在html和javascript中捕捉聚合物元素的屏幕截图
- YUIDocs 解析聚合物元素
- 仅在需要时实例化聚合物元素
- 如何从不同的元素访问聚合物元素中的属性
- 获取聚合物母元素
- 聚合物 - 访问自定义元素内的 DOM 输入元素
- 聚合物 - 将事件绑定到动态创建的元素
- 聚合物种子-自定义元素依赖关系
- 如何在渲染聚合物元素后触发事件
- 更新聚合物元素模板
- 如何使用javascript函数创建可以调用javascript函数的聚合物元素
- 我如何在safari中找到阴影DOM元素?(聚合物)
- 用core-ajax构建一个新元素聚合物中的XML
- 将事件从父元素传递到子元素(聚合物)
- 通过selenium javascriptExecutor访问影子DOM元素(聚合物)