【发布时间】:2015-03-11 04:55:15
【问题描述】:
所以我已经使用 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 中,当它去派发事件具体到 polymer.js 的第 9131 行时,变量 "method" 和 obj[method] 中的引用是 IE 中的字符串,因此没有方法适用。我想避免使用 parentNode 的原因是因为调用者不是直接父节点,所以我不想在找到正确的父节点之前一直获取 parentNodes,因为当我可以命名变量时代码更容易理解。
编辑 2
我现在要做的是(因为它在 IE9 中工作),尽管我将问题留待更好的答案是继续使用 IIFE,返回一个函数,该函数接受一个子参数。然后孩子将通过查询选择器找到感兴趣的父母。这意味着孩子必须对父母和调用方法有先见之明,这并不理想,但是... IE。
所以父级将其设置为...
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);
}
});
更好的想法?
【问题讨论】:
-
不确定用例是什么,但是请注意,如果您将父级的已发布属性向下传递给子级,那么如果子级修改了该属性,则父级的 attributeChanged 函数(如果您在place) 会被自动调用
标签: javascript polymer