2016-07-26 84 views
6

在角有時我看到大括號但有些時候not.i搜索了很多,但沒有花我無法找到正確的問題角時要使用大括號

用花括號

ng-src="{{imageSrc}} 

支架

ng-hide="imageSrc" 

什麼我問的是,爲什麼我們不能寫ng-hide作爲

ng-hide="{{imageSrc}} // doesn't work anyway 

爲什麼對於srchide有兩種不同的語法?

回答

6

它只是取決於您使用的指令是「聲明」的方式。

如果指令有以下聲明:

scope:{ 
    ngHide: '=' 
} 

那麼,你不必如果該指令宣佈類似下面使用雙小鬍子,因爲該指令預計的對象

scope:{ 
    ngMin:'@' 
} 

然後,它期望一個值。如果你的值來自一個JavaScript變量,那麼你必須使用大括號來插入你的變量中包含的字符串。

編輯:

它一直以來我讀角源代碼長的時間。

我還沒有發現任何的源代碼,以證明我的觀點:

ngController這需要一個字符串聲明類似如下

var ngControllerDirective = [function() { 
    return { 
    restrict: 'A', 
    scope: true, 
    controller: '@', 
    priority: 500 
    }; 
}]; 

https://github.com/angular/angular.js/blob/master/src/ng/directive/ngController.js#L3

ngMaxLength

var maxlengthDirective = function() { 
    return { 
    restrict: 'A', 
    require: '?ngModel', 
    link: function(scope, elm, attr, ctrl) { 
     if (!ctrl) return; 

     var maxlength = -1; 
     attr.$observe('maxlength', function(value) { 
     var intVal = toInt(value); 
     maxlength = isNaN(intVal) ? -1 : intVal; 
     ctrl.$validate(); 
     }); 
     ctrl.$validators.maxlength = function(modelValue, viewValue) { 
     return (maxlength < 0) || ctrl.$isEmpty(viewValue) || (viewValue.length <= maxlength); 
     }; 
    } 
    }; 
}; 

https://github.com/angular/angular.js/blob/master/src/ng/directive/validators.js#L186

+0

→最終的答案是:RTFM爲每個指令的期望。 – deceze

+0

謝謝你,但我應該查看角度源代碼來知道要使用什麼? –

+1

@whiletrue閱讀樣品。大多數時候你不需要任何雙鬍子 –

5

因爲它們是指兩種不同的東西。 當您使用此:

<span data-ng-bind="test"> 

這意味着角會去的範圍,並從那裏得到的值與測試的關鍵。所以價值將是$ scope.test。但attribte值將是「測試」

當您使用

ng-src="{{imageSrc}} 

那麼值將被評估,並放置該屬性。因此值將$ scope.imageSrc和屬性值將爲$ scope.imageSrc。

但是。並非所有的標籤都可以等待評估。他們認爲價值{{}}是正確的,不會被更改。這導致糟糕的請求。爲了解決這個問題,創建了ng-src。

+0

但是在'ng-hide ='imgSrc''的值應該被評估並替換?對不起,我很困惑 –

+0

不可以讓我們拆分問題。這裏是我們的跨度: 測試 注意class屬性。當DOM被渲染時,瀏覽器將會看到class =「myClass」。因爲它是適合的格式,所有都會沒事的。 然後,角度上升。它會看到data-ng-hide =「imgSrc」,進入範圍並獲得一個值。屬性data-ng-hide值不會被改變。但是,指令內的值將是! 然後!指令將根據最近得到的值用它自己的邏輯修改屬性類。就這樣。 – Vitalii