1

我在访问以下dom-if模板中的元素以添加自定义事件侦听器时遇到问题:

<template is="dom-if" if=[[!uploaded]]>
    <vaadin-upload id="upload" target="http://localhost:3000/uploadFile" form-data-name="doc" max-files="1">
        <iron-icon slot="drop-label-icon" icon="description"></iron-icon>
        <span slot="drop-label">....</span>
    </vaadin-upload>
</template>
<template is="dom-if" if="[[uploaded]]">
      <pdf-element src=[[....]]></pdf-element>
</template> 

我尝试以这种方式添加事件侦听upload-response器:upload-successconnectedCallback

connectedCallback() {
    super.connectedCallback();
    console.log(this.shadowRoot.querySelector('#upload'))
    this.shadowRoot.querySelector('#uploadFile').addEventListener('upload-response', event=>this._uploadFile(event))
    this.shadowRoot.querySelector('#uploadFile').addEventListener('upload-success', event=>this._uploadFileSuccessful(event))
  }

uploaded属性是false默认的。我在Polymer 2.0 docs中进行了搜索,但没有找到使其工作的方法。我总是得到null

控制台截图

我已经this.shadowRoot.querySelectordom-repeat模板中使用过,没有问题。我如何querySelector使用dom-if?

4

1 回答 1

2

即使条件是,<dom-if>内容还没有被标记,所以你必须等到下一个渲染帧:connectedCallbackiftruePolymer.RenderStatus.afterNextRender()

Polymer.RenderStatus.afterNextRender(this, () => {
  const uploader = this.shadowRoot.querySelector('#upload');
  uploader.addEventListener('upload-success', () => { /* ... */ });
});

演示

于 2018-02-17T00:23:16.120 回答