3

我正在尋找關於何時以及爲什麼要在指令定義中使用「require」選項的指導原則,爲什麼不使用範圍進行通信 - 就像大多數時間一樣在Angular中? 它是如何突然出現在指令中,我要求控制器本身,而不是僅僅將事情附加到作用域?AngularJS中的指令(和其他部分)之間的通信

一般而言 - 有許多方式角指令/控制器/示波器之間的通信 -

  • 範圍繼承。
  • RootScope「發射」。
  • 服務(工廠/服務/提供商)。
  • 在指令中要求控制器。
  • 在指令中要求新的範圍/隔離範圍/「正常」範圍。
  • 更多?

雖然我理解他們是如何在技術上工作的,但我不清楚哪些指導原則決定使用哪一個以及爲什麼。

對於一些通用/高級別準則會很高興。謝謝。即,要創建具有指導自己的表單控件 -

回答

2

require如果你想創建custom form controls(請參閱從控制部分實現自定義)特別有用。您可以通過requirengModelController通過API /函數訪問大量現有的功能。

另一種使用情況是AngularJS主頁上發現,部分創建組件,其中pane指令使用require: '^tabs'獲得訪問tabs控制器。由於這兩個組件/指令都會創建隔離範圍,因此範圍繼承不是一種選擇。服務也不太適合,因爲你的應用可能有多個tabs指令。因此,在這種情況下,控制器被用作pane指令的手段,能夠影響tabs範圍 - 以便能夠進入範圍。如果不使用require,則pane指令無法獲得tabs範圍。我在此更詳細地(用圖片)討論這個SO回答:'this' vs $scope in AngularJS controllers

require如果控制器的感興趣的相同的元素上定義只能被使用(例如,ngModelController),或者如果有一個層次結構(例如,窗格 - >選項卡)。

+0

謝謝馬克,我還會讀其他你討論過的指導。 「由於這些組件/指令都創建了隔離範圍,所以範圍繼承不是一種選擇。」即使在隔離範圍內,我們可以使用'@'或'='並獲得一些繼承,我猜這個問題仍然是繼承與範圍鏈中較高的選項卡/窗格衝突?或者我把它全部弄錯了? – Daniel 2013-05-09 17:31:52

+0

@Daniel,true,'@'或者'='可以被使用,但是這需要'pane'指​​令通過HTML傳遞屬性 - 也就是說,需要爲每個指定'addPane()'方法使用窗格:''。所以在這裏使用'require'似乎是一個更清潔的方法。 – 2013-05-09 18:35:24