一旦所有子元素都_实际_更新,就运行一个函数

Mer*_*erc 4 polymer lit-element lit-html

在 lit-html 中,我们有一种firstUpdated()方法可以在渲染元素后运行一次性初始化。

如果您只需要在该模板中的所有子项更新后才运行某个函数,该怎么办?如果您的模板包含本机表单元素和自定义表单元素怎么办?

现在我正在做一件可怕的事情:

  firstUpdated () {
    super.firstUpdated()

    setTimeout(() => this.onceChildrenAreUpdated(), 100)
  }
Run Code Online (Sandbox Code Playgroud)

当然有更好的方法吗?我意识到这很棘手,因为对于 lit-element 来说“渲染”意味着 DOM 已经完成;这并不意味着里面的所有元素都已经完成了接下来想要做的初始化。

但仍然...

Jus*_*ani 6

您可以等待所有子项更新:

  async firstUpdated () {
    const children = this.shadowRoot.querySelectorAll('*'));
    await Promise.all(Array.from(children).map((c) => c.updateComplete));
    this.onceChildrenAreUpdated();
  }
Run Code Online (Sandbox Code Playgroud)

如果可能的话,用更具体的东西替换querySelectorAll('*')