2013-10-10 208 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 
     } 
    }; 
}); 

总之,在依赖注入的情况下,范围对象被接收为$范围而在非依赖注入范围对象的情况下被接收为范围或与任何名称。