Javascript 如何指定运行嵌套web组件构造函数的顺序?
我创建了两个web组件,并将其中一个嵌套到另一个中。 它们都有自己的Javascript 如何指定运行嵌套web组件构造函数的顺序?,javascript,web-component,native-web-component,Javascript,Web Component,Native Web Component,我创建了两个web组件,并将其中一个嵌套到另一个中。 它们都有自己的构造函数。我的问题是,我无法控制运行构造函数的序列。 有什么办法可以让我说出来吗 这是我的密码: 子web组件: (function () { const template = document.createElement('template'); template.innerHTML = `<div>WC1</div>`; class WC1Component extends
构造函数
。我的问题是,我无法控制运行构造函数的序列。
有什么办法可以让我说出来吗
这是我的密码:
子web组件:
(function () {
const template = document.createElement('template');
template.innerHTML = `<div>WC1</div>`;
class WC1Component extends HTMLElement {
constructor() {
super();
console.log('WC1: constructor()');
var me = this;
me._shadowRoot = this.attachShadow({ 'mode': 'open' });
me._shadowRoot.appendChild(template.content.cloneNode(true));
}
connectedCallback() {
console.log('WC1: connectedCallback');
}
test() {
console.log('test:wc1');
}
}
window.customElements.define('wc-one', WC1Component);
}());
(function () {
const template = document.createElement('template');
template.innerHTML = `
<wc-one id="wc1"></wc-one>
<div>WC2</div>
`;
class WC2Component extends HTMLElement {
constructor() {
super();
console.log('WC2: constructor()');
var me = this;
me._shadowRoot = this.attachShadow({ 'mode': 'open' });
me._shadowRoot.appendChild(template.content.cloneNode(true));
me._wc1 = me._shadowRoot.querySelector('#wc1');
}
connectedCallback() {
console.log('WC2: connectedCallback');
this._wc1.test(); // <-- Error: test is undefined!
}
}
window.customElements.define('wc-two', WC2Component);
}());
您可以使用:
setTimeout(() => {
this._wc1.test();
});
在connectedCallback中,实际上您可以控制构造函数的运行顺序
由于
是由
创建的,因此总是在WC1之前调用WC2构造函数
错误的原因是,当您尝试调用它时,内部组件(WC1)尚未添加到DOM中
您可以侦听DOMContentLoaded
事件以确保元素正常,或者在window
上侦听load
事件,或者实现window.onload
处理程序@elanz nasiri也在工作
DOMContentLoaded
将首先触发
有其他解决方案,但它们更难实现
window.customElements.define('wc-one',类扩展HtmleElement{
构造函数(){
超级()
this.attachShadow({'mode':'open'})。innerHTML=`WC1`
}
测试(来源){
log('test:wc1',source)
}
} )
window.customElements.define('wc-two',类扩展HtmleElement{
构造函数(){
超级()
this.\u shadowRoot=this.attachShadow({'mode':'open'})
这个._shadowRoot.innerHTML=`WC2`
this._wc1=this._shadowRoot.querySelector('#wc1');
}
connectedCallback(){
setTimeout(()=>this.\u wc1.test('setTimeout'))
document.addEventListener('DOMContentLoaded',()=>this.\u wc1.test('DOMContentLoaded'))
window.onload=()=>这个._wc1.test('window.onload'))
window.addEventListener('load',()=>this.\u wc1.test('load'))
}
})
如果要控制何时调用构造函数,则需要调用它。不允许HTML解析器为您执行此操作。允许HTML解析器这样做的问题是,您不知道组件何时升级
const template=document.createElement('template');
template.innerHTML=`WC1`;
类WC1组件扩展了HtmleElement{
构造函数(){
超级();
log('WC1:constructor()');
this.attachShadow({'mode':'open'});
this.shadowRoot.appendChild(template.content.cloneNode(true));
}
connectedCallback(){
log('WC1:connectedCallback');
}
测试(){
log('test:wc1');
}
}
window.customElements.define('wc-one',WC1组件);
//
//WC2
类WC2Component扩展了HtmleElement{
构造函数(){
超级();
log('WC2:constructor()');
设wc1=document.createElement('wc-one');
wc1.id='wc1';
this.attachShadow({'mode':'open'});
这个。_wc1=wc1;
this.shadowRoot.appendChild(wc1);
设div=document.createElement('div');
div.textContent='WC2';
this.shadowRoot.appendChild(div);
}
connectedCallback(){
log('WC2:connectedCallback');
这个._wc1.test();
}
}
window.customElements.define('wc-two',WC2Component)代码>
您可以使用“异步”、“延迟”作为脚本标记。例如,您希望在wc2.js之前加载wc1.js:。但它不是许多js文件的解决方案。您可以查看“gulp”或“webpack”将帮助您更好地管理js文件。@tahereh感谢您接受的答案,如果有帮助,您可以向上投票:-)
setTimeout(() => {
this._wc1.test();
});