SAP Spartacus 自定義Popover指令,如何實現彈出對話方塊自動關閉功能

注销發表於2021-04-11

Popover Component的 appendToBody如果設定成true:

則其 DOM 元素會出現在 body 節點的 末尾:

當我點選螢幕任意空白位置時,這個Popover 對話方塊會自動消失。

準確的說,是從 DOM tree中移除,而不是設定成invisible.

Popover 自定義指令的實現原始碼裡,會透過@HostListener來監控宿主元素的 document:click 事件。

如果this.insideClicked為false,說明是outside_click, 因此使用eventSubject傳送這個事件。

這裡要解決兩個問題:

  1. this.insideClicked 的標誌位什麼時候設定的?
  2. 透過EventSubject傳送的諸如OUTSIDE_CLICK的事件,監聽者是誰?

首先解決第一個問題。如果Popover本身的宿主元素,即Popover Component wrapper被點選,this.insideClicked被置為true,同時傳送PopoverEvent.INSIDE_CLICK事件:

否則,當document:click事件觸發時,說明Popover Component wrapper 之外的區域被點選,此時傳送PopoverEvent.OUTSIDE_CLICK事件:

第二個問題:

在handlePopoverEvents方法的this.popoverContainer.instance.eventSubject.subscribe裡,註冊EventSubject對應事件的處理函式:

函式handlePopoverEvents在Popover 例項建立後,執行其方法renderPopover時被呼叫:


注意,this.viewContainer.clear方法呼叫,觸發 DOM 元素被刪除的原生操作。

在這裡插入圖片描述

更多Jerry的原創文章,盡在:"汪子熙":

相關文章