簡體   English   中英

如何監聽自定義事件定義的Web組件

[英]How to listen for custom events defined web component

我有一個自定義元素my-checkbox ,它包含一個復選框,標簽,樣式等。當切換該復選框時,我在我的構造函數中定義一個名為check的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-checkreport ,其中包含my-checkbox,應該對“check”事件作出反應。 我在my-checkreport的連接回調中定義了一個事件監聽my-checkreport

connectedCallback(){
  ...
  this.addEventListener("check", function (e) {
        console.log('listend to check event');
        console.log(e);
    });
 }

但是,這個eventListener永遠不會觸發,似乎永遠不會“聽到” my-checkbox組件中調度的“check”事件。 我已經嘗試在構造函數中添加此偵聽器,但結果相同。

我有什么想法我做錯了嗎?

背景:我這樣做是為了使這些元素可以組合。 我還讀過,開發Web組件的最佳實踐是“使用自定義事件將信息傳遞出組件......”

如果復合元素<my-checkreport>使用Shadow DOM嵌入其內容( <my-checkbox> ,label,樣式...),則內部元素(此處為<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的更多信息:

對於那些最終到達這里的人來說,你正在尋找的特定屬性是打破陰影根“監獄”的“組成”。

所以:

this.checkEvent = new CustomEvent("check", {
  bubbles: true,
  cancelable: false,
  composed: true
});

如果您願意,還可以添加另一個屬性“詳細信息”,該屬性將包含事件的自定義數據。

更多信息在這里: 組成的財產

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM