我們不知道是什麼範圍將包含在使用我們的指令點。 因此,爲我們的指令提供一個定義明確的公開 界面接口是一個好習慣。這可以確保該指令不能依賴於其使用的範圍上的任意屬性,也不會受其影響。 我們有三個選項用於我們的指令及其模板中使用的範圍。 在指令定義中定義:
•從使用小部件的位置重用範圍。這是默認的 ,對應於範圍:false。
•創建一個子範圍,它從使用該控件的範圍中原型繼承。你可以使用scope來指定它:true。
•創建一個不原型繼承的隔離範圍,以便它與其父項完全隔離。您可以通過將對象傳遞給 scope屬性來指定此範圍:scope:{...}。 我們希望將我們的小部件模板與 應用程序的其餘部分完全分離,以便在兩者之間沒有數據泄漏的危險。
注: - [在一個孤立的範圍不prototypically從其父, 繼承它仍然可以通過$ parent屬性訪問其父的範圍。 但是,這是因爲你破壞了 脫離其周圍的指令被認爲是不好的做法。]
由於我們的範圍現在是從父範圍隔離,我們需要父範圍之間明確地映射 值孤立的範圍。這是通過在指令出現的元素的屬性上引用 AngularJS表達式來完成的。 對於我們的分頁指令,num-pages和當前頁面屬性履行此角色。 我們可以通過手錶將這些屬性中的表達式與 模板範圍內的屬性同步。我們可以手動設置它,或者我們可以要求 AngularJS爲我們進行連線。有三種類型的接口,我們可以在元素的屬性和隔離範圍之間指定 :interpolate(@),data bind(=)和表達式(&)。您可以在指令定義的範圍屬性中將這些接口指定爲鍵值對。 關鍵是隔離範圍上的字段的名稱。值@ =之一,或& 接着元件上的屬性的名稱:
scope: {
isolated1: '@attribute1',
isolated2: '=attribute2',
isolated3: '&attribute3'
}
在這裏,我們已經定義了對所述分離的範圍的三個字段和AngularJS人員 值從指定映射指令出現的元素上的屬性。
注: [如果屬性名稱是從值被省略,則假定 該屬性具有相同的名稱作爲所述分離的範圍字段: 範圍:{isolated1:「@」} 它將期望的屬性被稱爲isolated1。]
插值與@屬性 的@符號指示AngularJS應該內插指定 屬性的值,並更新所述分離的範圍屬性時它的變化。插值是 與{{}}花括號一起使用來使用父作用域中的值生成字符串。 注意: - [一個常見的錯誤是期望內插對象本身是對象 。插值始終返回一個字符串。因此,如果您有一個對象,比如說 用戶有一個名爲userName的字段,則{{user}} 的插值會將用戶對象轉換爲字符串,並且您將無法 訪問字符串上的userName屬性。 ]
該屬性內插相當於手動$觀察屬性:
attrs.$observe('attribute1', function(value) {
isolatedScope.isolated1 = value;
});
ATTRS $$觀察員[ 'ATTRIBUTE1'] $$範圍= parentScope; 使用= 將數據綁定到該屬性=符號表示AngularJS應該將表達式保留在指定的 屬性中,並且隔離範圍上的值彼此同步。這是一個雙向 數據綁定,它允許直接在內部 和控件外部映射對象和值。 由於此接口支持雙向數據綁定,屬性中給出的表達式 應該是可分配的(即,指的是 作用域或對象上的字段),而不是任意的計算表達式。 這種結合是一個有點像設置了兩個$手錶功能:
var parentGet = $parse(attrs['attribute2']);
var parentSet = parentGet.assign;
parentScope.$watch(parentGet, function(value) {
isolatedScope.isolated2 = value;
});
isolatedScope.$watch('isolated2', function(value) {
parentSet(parentScope, value);
});
實際的實現更復雜,以確保兩個範圍的穩定性。 提供回調錶達在 屬性與& 的&符號表示在屬性設置在元件 上的表達將提供的範圍,因爲,調用它時,將執行表達式 的函數。這對於從窗口小部件創建回調很有用。 建立自己的指令 這種結合相當於$解析屬性中的表達和暴露在隔離範圍 解析表達式功能:
parentGet = $parse(attrs['attribute3']);
scope.isolated3 = function(locals) {
return parentGet(parentScope, locals);
};