Popover Component的 appendToBody如果設定成true:
則其 DOM 元素會出現在 body 節點的 末尾:
當我點選螢幕任意空白位置時,這個Popover 對話方塊會自動消失。
準確的說,是從 DOM tree中移除,而不是設定成invisible.
Popover 自定義指令的實現原始碼裡,會透過@HostListener來監控宿主元素的 document:click 事件。
如果this.insideClicked為false,說明是outside_click, 因此使用eventSubject傳送這個事件。
這裡要解決兩個問題:
- this.insideClicked 的標誌位什麼時候設定的?
- 透過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的原創文章,盡在:"汪子熙":