【发布时间】:2019-08-28 20:52:53
【问题描述】:
我有两个自定义元素:One 和 Two。 One 有一个功能。 Two 有一个 One 的孩子,并尝试在其构造函数中调用该函数。它说如果我在One 之前在Two 上调用customElements.define(),则该函数不存在。但是,如果我在Two 之前定义One,它就可以正常工作。
在我的实际项目中,我无法控制它们的定义顺序,默认情况下它们的定义顺序错误。
我尝试调用connectedCallback()中的函数,但也失败了。
具体什么时候调用构造函数?
有什么方法可以确保在调用任何构造函数之前都定义了它们?
class One extends HTMLElement {
constructor() {
super()
console.log('one constructor')
}
myFunc() {
console.log('it worked!')
}
}
class Two extends HTMLElement {
constructor() {
super()
console.log('two constructor')
this.innerHTML = '<my-one></my-one>'
this.myOne = document.querySelector('my-one')
// this part fails
this.myOne.myFunc()
}
connectedCallback() {
// this also fails
this.myOne.myFunc()
}
}
// this works
// customElements.define("my-one", One)
// customElements.define("my-two", Two)
// this breaks
customElements.define("my-two", Two)
customElements.define("my-one", One)
<my-two></my-two>
【问题讨论】:
-
元素二依赖于元素一存在,所以你有点需要等到该元素被定义。这样做的现代解决方案是在其自己的模块中定义每个自定义元素,并确保以
import One from "./one.js";启动两个模块,以便浏览器可以强制解析顺序,即使网络加载顺序完全不同。 -
至于何时调用构造函数:在注册自定义元素的element upgrade part期间调用构造函数时不带参数,所以没有“声明”自定义元素不构造一个:part定义过程的核心是验证元素 可以 被构建,实际上是构建一个。
-
(可以在 html.spec.whatwg.org/multipage/… 上找到更多好的建议:例如,在
connectedCallback之前不要使用该 innerHTML 和选择器代码。不要在构造函数中这样做)
标签: javascript html custom-element