我有一个自定义元素my-checkbox
,它包含一个复选框,标签,样式等。当切换该复选框时,我在我的构造函数中定义了一个CustomEvent
命名检查,如下所示:
constructor(){
super();
this._shadowRoot = this.attachShadow({mode: 'open'});
this.checkEvent = new CustomEvent("check", {
bubbles: true,
cancelable: false,
});
}
我在切换复选框时调度该事件:
toggleCheckbox(){
this.dispatchEvent(this.checkEvent);
console.log(this.checkEvent);
...
}
我推断这个事件正在调度,因为console.log的内容显示了CustomEvent的签名
我有另一个包含my-checkbox的自定义元素my-checkreport
,应该对" check"做出反应。事件。我在my-checkreport
connectedCallback(){
...
this.addEventListener("check", function (e) {
console.log('listend to check event');
console.log(e);
});
}
然而,这个eventListener永远不会开火,似乎永远不会听到' "检查"在my-checkbox
组件中调度的事件。我尝试在构造函数中添加此侦听器并获得相同的结果。
任何想法我做错了什么?
背景:为了使这些元素可以组合,我这样做了。我还读过,开发Web组件的最佳实践是使用自定义事件将信息传递出组件......"
答案 0 :(得分:12)
如果您的复合元素<my-checkreport>
使用Shadow DOM嵌入其内容(<my-checkbox>
,标签,样式...),则来自内部元素(此处为<my-checkbox>
)的已调度事件将在(容器的)Shadow DOM中被解雇。
因此,您应该将事件侦听器添加到复合自定义元素(this._shadowRoot
)的Shadow DOM根目录,而不是元素(this
)本身。在<my-checkreport>
:
connectedCallback(){
...
this._shadowRoot.addEventListener("check", function (e) {
console.log('listend to check event');
console.log(e);
});
}
有关Shadow DOM的更多信息:
答案 1 :(得分:6)
对于其他到这里结束的人,您要从影子根“ jail”中突破的特定属性是“组成”。
所以:
this.checkEvent = new CustomEvent("check", {
bubbles: true,
cancelable: false,
composed: true
});
如果您愿意,还可以添加另一个属性“ detail”,该属性将携带有关事件的自定义数据。
此处有更多信息:composed property