Angularjs:$scope vs scope
在Angularjs中,在控制器中使用Angularjs:$scope vs scope,angularjs,Angularjs,在Angularjs中,在控制器中使用$scope,在指令链接函数中使用scope(不含“$”)是否有特定的原因?这仅仅是一种约定还是其他什么?当您在控制器中执行$scope时,依赖项注入基于匹配变量名$scope,在这种情况下,使用scope作为名称将不起作用 对于指令,注入是基于位置的,因此您可以命名变量a或b或任何东西。链接函数的指令顺序为 (范围、项目、iAttrs、控制器) 因此,第一个元素始终是范围对象。您也可以在这里找到John Lindquist对这个问题的一个非常好的视频答案:
$scope
,在指令链接函数中使用scope
(不含“$”
)是否有特定的原因?这仅仅是一种约定还是其他什么?当您在控制器中执行$scope
时,依赖项注入基于匹配变量名$scope
,在这种情况下,使用scope
作为名称将不起作用
对于指令,注入是基于位置的,因此您可以命名变量a
或b
或任何东西。链接函数的指令顺序为
(范围、项目、iAttrs、控制器)
因此,第一个元素始终是范围对象。您也可以在这里找到John Lindquist对这个问题的一个非常好的视频答案:
.此行为的原因是,与控制器不同,指令不使用依赖项注入,而是传递由放置在视图后面的控制器创建的范围。
这是非常棘手的,因此您可以在不同的作用域上重用指令。在
“$scope”
中的$
表示正在将作用域值注入当前上下文中
$scope
是由$scopeProvider
提供的服务。您可以使用Angular的内置依赖项注入器将其注入控制器、指令或其他服务:
module.controller(function($scope) {...})
这是
module.controller(['$scope', function($scope) {...}])
然而,scope
可以是任何东西,它是一个函数参数名,可以是foo
或a12342saa
function link( scope, element, attributes ) {
// Only scope
}
“$scope”中的“$”表示正在将范围值注入当前上下文。但是,并非所有对作用域的引用都基于依赖项注入。模块工厂方法,如控制器、指令、工厂、过滤器、服务、动画、配置和运行,通过依赖项注入(DI)接收参数。在DI的情况下,使用美元前缀注入范围对象,即$scope。原因是注入参数必须与可注入对象的名称匹配,后跟美元($)前缀 例如,您可以将作用域和元素对象注入控制器,如下所示:
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
}
};
});
简言之,在依赖项注入的情况下,范围对象作为$scope接收,而在非依赖项注入的情况下,范围对象作为范围或任何名称接收。它只是一个变量名,所以不是真的。感谢您的回答,类似的问题。我在这里还找到了一个详细的解释:我将后面的部分澄清为“对于指令链接函数的情况,注入是基于位置的,因此使用
scope
实际上只是惯例。”(我找不到任何好的解释来解释为什么这里不使用$scope
,如果只是为了一致性的话)完美的解释,谢谢你指出了正确的方向。