2013-01-13 184 views
46

請參閱例如hereAngularjs指令:隔離範圍和ATTRS

foodMeApp.directive('fmRating', function() { 
    return { 
    restrict: 'E', 
    scope: { 
     symbol: '@', 
     max: '@', 
     readonly: '@' 
    }, 
    require: 'ngModel', 
    link: function(scope, element, attrs, ngModel) { 

     attrs.max = scope.max = parseInt(scope.max || 5, 10); 
... 

角需要symbolmaxreadonly在分離的範圍對象從父範圍訪問它來限定。

它是用來here

<fm-rating ng-model="$parent.restaurant.price" symbol="$" readonly="true"></fm-rating>

那麼,什麼是attrs的目的是什麼?無法訪問通過attrs傳遞的所有屬性。爲什麼不能訪問max的最大值爲attrs.max而不是scope.max

爲什麼要返回像attrs.max = scope.max

由於這個應用程序是由Angular作者編寫的,我期待一個理由。

謝謝。

+1

請查看此處http:///stackoverflow.com/questions/14050195/what-is-the-difference-between-and-in-directive-scope/14063373#14063373 –

回答

94

attrs的目的是什麼?爲您的指令在相同的元素定義

屬性有幾個目的:

  1. 他們將信息傳遞到使用的分離範圍指令的唯一途徑。由於指令隔離範圍沒有從父範圍原型繼承,我們需要一種方法來指定我們想要傳遞給隔離範圍的內容。 「對象散列」中的'@','='和'&'因此每個都需要一個屬性來指定傳遞哪些數據/信息。
  2. 他們作爲一個指導之間的溝通機制。 (例如,Managing communication between independent AngularJS directives independently
  3. 他們normalize的屬性名稱。

不能一次訪問所有屬性通過ATTRS通過呢?

是的,你可以,但

  1. 你不會有任何數據綁定。
    「@」設置單向「字符串」數據綁定(父範圍→指令隔離範圍)使用@您在指令中看到/獲取的值始終是一個字符串,因此如果您嘗試傳遞一個對象給你的指令。
    '='設置雙向數據綁定(父範圍↔指令隔離範圍)。
    如果沒有數據綁定,您的指令不能自動監視模型/數據。
  2. 屬性值與{{}} s會導致你的問題,因爲他們不會被插值。
    假設我們有<my-directive name="My name is {{name}}">,並且父範圍有$scope.name='Mark'。然後,在鏈接功能中,console.log(attrs.name)結果爲undefined
    如果name是用'@'定義的孤立範圍屬性,則attrs.$observe('name', function(val) { console.log(val) })的結果爲My name is Mark。 (請注意,邏輯函數裏面,$觀察()必須用於獲取插值)

爲什麼可以最大程度沒有一個訪問值作爲attrs.max代替scope.max

回答上述

爲什麼分配回來就好attrs.max = scope.max?

我能想到這樣做的唯一原因是在其他指令需要看到這個屬性/值(即指令間通信)的情況下。但是,其他指令需要在此指令之後運行才能工作(可通過priority指令設置進行控制)。

摘要:在具有隔離範圍的指令中,通常不想使用attrs。 (我想這可能是一種將初始化數據/值發送到指令的方式 - 也就是說,如果您不需要對這些值進行數據綁定,並且您不需要插值。)

+3

謝謝你的詳細解答。我讚揚你的努力,特別喜歡你的文章https://github.com/angular/angular.js/wiki/The-Nuances-of-Scope-Prototypal-Inheritance。做得好。 – bsr

3

使用ATTRS你能夠訪問你的HTML代碼中定義的屬性,如

<fm-rating ng-model="$parent.restaurant.price" symbol="$" readonly="true"> 

因此,在這種情況下,你將有機會獲得符號只讀屬性。您在自定義指令中定義的每個屬性都可用於變量attrs變量。

塊:

attrs.max = scope.max = parseInt(scope.max || 5, 10); 

威爾parse和分配當前scope.max值或,如果不存在,到scope.max和attrs.max。這樣,作業完成後,您可以從attrs.max中讀取。在此之前,未定義的attrs.max屬性。

檢查fmRating.js源碼我不知道爲什麼/何地/何時使用這段代碼。