2013-03-03 135 views
8

我想要在angularjs中將範圍包裹在範圍內,特別是當涉及到對使用指令的模塊調用回調時。我發現了3種不同的方式來完成同樣的事情,我試圖理解每種方法的優缺點。指令回調和範圍

Given this plnkr

什麼時候適合使用&=,或直接在父母通話功能?

我更喜歡用「=」號綁定,因爲在指令和模塊主辦指令需要更少的代碼,但according to the documentation(瞭解Transclusion和範圍)似乎與&結合回調是首選方法,爲什麼?

回答

7

好問題。這些決定應該從試圖區分你的擔憂的角度出發。所以我們必須消除調用父範圍的方法 - 指令必須知道父母的太多內容。

接下來,我們看目的。回調是根據定義的方法。 &評估父範圍上下文中的表達式,而雙向綁定僅僅是一個變量名稱。 &很多功能更強大,給你的指令的用戶更多的靈活性。當然,他們能做到這一點,就像在你的榜樣:

<my-dir cb="callMe()"></my-dir> 

但是,他們也可以這樣做:

<my-dir cb="myVar = false"></my-dir> 

我們沒有在一個變量的名稱傳遞 - 這是任何 AngularJS expression。因此,組件的用戶可以以適合他們的任何方式自由地對您的事件做出反應。真棒!

但是,該指令也可以對狀態變化作出反應。例如,你可以檢查條件:

<my-dir cb="myVar"></my-dir> 

而且myVar可以評估的任何價值,你的指令可以知道這隨時變化並作出相應反應。代替共享變量,您將共享表達式。在這種情況下,雙向綁定是可行的,但如果指令不能(也可能不應該)更改該變量,爲什麼我們需要雙向綁定?

但是,它不一定是一個變量。如何評估真或假的表達式?

<my-dir cb="myVar == myOtherVar"></my-dir> 

我們的指令不必在意父範圍如何到達一個價值 - 只有工作的價值最終

因此,我們可以將它用於父範圍,以便對指令作出反應,或者對指令作出反應以便對父項作出反應 - 所有這些都使用靈活的表達式。整齊。

因此,=用於確保數據綁定;它確保了指令被使用的範圍和指令本身在某個變量上保持同步。&允許在父範圍的上下文中評估表達式,並且允許指令或父範圍對潛在複雜的狀態更改作出反應。

+0

謝謝,這讓我很清楚。 &評估表達式,=綁定到父範圍。 – Jason 2013-03-03 19:41:24