聚合物:this.$[elementId] 未定义
Polymer : this.$[elementId] is undefined
这是一个简单的聚合物元素,它只使用其 id 和 this.$.[elementId]
访问内部元素,然后记录它。 运行,这段简单的代码,你就能看到返回的元素undefined
。为什么?
<dom-module id="custom-element">
<template>
<template is="dom-if" if="[[condition]]">
<div id="main"></div>
</template>
</template>
<script>
class CustomElement extends Polymer.Element {
static get is() { return "custom-element"; }
static get properties() {
return {
condition : Boolean
};
}
ready(){
super.ready();
console.log(this.$.main); // logs "undefined"
}
}
customElements.define(CustomElement.is, CustomElement);
</script>
</dom-module>
Polymer this.$
仅引用来自本地 DOM 的元素 ,这些元素不是动态添加的。因此,放置在 dom-if
或 dom-repeat
模板中的 元素不会添加到 this.$
对象 .
如果您希望 select 动态元素,您需要转到 dom 并使用类似 this.shadowRoot.querySelector('#main')
的内容
这里有一个解决这个问题的方法。在您的 ready()
中添加以下代码:
if (this.$)
this.$ = new Proxy(this.$, {
get: ($, id) => $[id] || this.shadowRoot.getElementById(id),
set: ($, id, element) => {
$[id] = element;
return true;
}
});
这是一个简单的聚合物元素,它只使用其 id 和 this.$.[elementId]
访问内部元素,然后记录它。 运行,这段简单的代码,你就能看到返回的元素undefined
。为什么?
<dom-module id="custom-element">
<template>
<template is="dom-if" if="[[condition]]">
<div id="main"></div>
</template>
</template>
<script>
class CustomElement extends Polymer.Element {
static get is() { return "custom-element"; }
static get properties() {
return {
condition : Boolean
};
}
ready(){
super.ready();
console.log(this.$.main); // logs "undefined"
}
}
customElements.define(CustomElement.is, CustomElement);
</script>
</dom-module>
Polymer this.$
仅引用来自本地 DOM 的元素 ,这些元素不是动态添加的。因此,放置在 dom-if
或 dom-repeat
模板中的 元素不会添加到 this.$
对象 .
如果您希望 select 动态元素,您需要转到 dom 并使用类似 this.shadowRoot.querySelector('#main')
这里有一个解决这个问题的方法。在您的 ready()
中添加以下代码:
if (this.$)
this.$ = new Proxy(this.$, {
get: ($, id) => $[id] || this.shadowRoot.getElementById(id),
set: ($, id, element) => {
$[id] = element;
return true;
}
});