我有一個下拉菜單元素指令本質上顯示帶有附加功能的樣式下拉列表。在Angular中向父控制器附加附加功能
我的下拉控制器有一個名爲openDropdownItems
的函數,該函數在顯示列表時執行。
然後我也有另一個屬性指令稱爲setInViewWhen
提供當條件爲真時的元件應該被滾動到視圖中的表達式。
<x set-in-view-when="something.item === selectedItem">
這只是應用了我的屬性指令一些X元素的例子。
事情是,我希望我的下拉列表項(即LIs)在它們上有這條指令,所以當用戶使用鍵盤瀏覽它們時,它會在它們傳遞可見視口時自動在視圖中滾動它們。這些項目是否顯示在可滾動容器中,或者作爲整體顯示在比瀏覽器視口更長的列表中並不真正相關。
主要想法是滾動按照下拉列表選擇。是否應該滾動主窗口。
問題
我可以讓我的setInViewWhen
指令完全獨立的,但是這意味着我將不得不尋找最接近的滾動容器每當一個項目病情變化。這似乎是相當多的處理,我想避免重複(我需要遍歷DOM向上,檢查每個節點的計算的樣式表屬性OverflowY +一些額外的檢查。
這基本上似乎是多餘的,因爲每當我得到最近滾動的祖先相同的指令,所有兄弟元素可以重用的計算結果。
問題1
我如何共享兄弟指令之間這方面的知識?如果我是觸發一個事件我不知道是否接收器是兄弟姐妹或沒有任何額外的處理。
問題2
相反,當我的指令的條件爲真我理論上可以改變下拉父母的openDropdownItems
先完成它的原始執行的,然後還執行滾動性檢查,並與一起使用它的結果,每一次檢查滾動容器我的指令的條件。 我可以通過指令requires
屬性訪問我的指令中的下拉控制器,並在鏈接後階段進行調整。
但是這也意味着我不能在我的下拉菜單之外使用我的指令,因爲它是一個通用指令,我可以在我的應用程序的幾個元素上添加一些元素,以便在某些條件下將元素滾動到視圖中。
一些想法/意見:(1)對於Q1,存在用於同級的指示與彼此通信的直接方式。我通常創建一個封裝父指令來中繼消息。 (2)我*猜*條件'something.item === selectedItem'引入一個手錶;對於選擇項目列表,這可能是許多手錶並且對性能不利。我寧願在LI的父母中有一個手錶,並在那裏添加「滾動到視圖」邏輯。 –
(3)在2點在心中,你仍然可以有一個獨立的'setInViewWhen'指令(似乎很有用)*和*有你'X'選替代指令份額與它的代碼的控制器。例如。創建具有共同功能的服務,創建包含JS「類」的角度值,並具有兩個'setInViewWhen'和'的控制器X'指令從它(或其他溶液)延伸。 –
(4)相對到Q2:當孩子可能要求他們的父母,並在改變它的方法(這種技術甚至被角認可,看到NG-模型和定製控件),會有很多孩子進行更改,這可能導致一團糟...... –