聚合物: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-ifdom-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;
        }
    });