2013-10-10 243 views
26

在Angularjs中,是否有特定的原因在控制器中使用$scope而在指令鏈接函數中使用scope(沒有"$")?這只是一個約定或其他什麼?

+1

這只是一個變量名,所以不是真的。 – ivarni

+0

類似的問題[這裏](http://stackoverflow.com/questions/18719140/angular-link-function-scope-vs-scope/18719347#comment27583647_18719347) – gargc

回答

26

在控制器中執行$scope的情況下,依賴注入根據變量名稱$scope匹配注入範圍,在這種情況下使用scope作爲名稱將不起作用。

對於指令的情況下,注射是基於位置的,所以你可以命名你的變量ab或任何東西。鏈路功能的指令順序是

(scope, iElement, iAttrs, controller)

所以第一個元素總是範圍對象。

+1

感謝您的回覆。我也在這裏找到了一個詳細的解釋:http://www.thinkster.io/pick/aw9kWmdnik/angularjs-scope-vs-scope – Vijey

+0

我會澄清後一部分爲「對於指令鏈接函數的情況,注入是位置因此使用'範圍'實際上只是慣例。「 (我找不到任何好的解釋,爲什麼在這裏不使用'$ scope',如果只是爲了一致性) – rinogo

1

此行爲的原因是,與控制器不同,指令不使用依賴項注入,而是它們傳遞由放置在視圖後面的控制器創建的作用域。 這是非常棘手的,所以你可以在不同的範圍重用你的指令。

0

$ in "$scope"表示範圍值正被注入到當前上下文中。

$scope是由$scopeProvider提供的服務。你可以把它注射到控制器中,指令或其他服務的採用了棱角分明的內置依賴注入:

module.controller(function($scope) {...}) 

這是簡寫形式,

module.controller(['$scope', function($scope) {...}]) 

然而,scope可以是任何東西,它是一個函數參數名,可能是fooa12342saa

function link(scope, element, attributes) { 
    // Only scope 
} 
0

「$ scope」中的「$」表示範圍值被注入到當前上下文中。但是,並非所有對範圍的引用都是基於依賴注入的。

2

模塊工廠方法如控制器,指令,工廠,過濾器,服務,動畫,配置和運行通過依賴注入(DI)接收參數。在DI的情況下,您會注入範圍對象以及美元前綴,即$範圍。原因是注入的論點必須匹配注入能力對象後跟美元($)前綴的名稱。

例如,可以注入的範圍和下面給出元件對象到控制器:

module.controller('MyController', function ($scope, $element) { // injected arguments }); 

當像指令接頭功能的方法不必通過依賴注入接收參數,則只是通過範圍對象而不使用美元前綴,即範圍。原因是傳入的參數被其調用者接收。

module.directive('myDirective', function() // injected arguments here 
{ 
    return { 
     // linker function does not use dependency injection 
     link: function (scope, el, attrs) { 
      // the calling function will passes the three arguments to the linker: scope, element and attributes, in the same order 
     } 
    }; 
}); 

總之,在依賴注入的情況下,範圍對象被接收爲$範圍而在非依賴注入範圍對象的情況下被接收爲範圍或與任何名稱。