在 Angularjs 中,是否有特定的理由$scope
在控制器和指令链接功能中使用scope
(没有)?"$"
这只是一个约定还是其他什么?
6 回答
在$scope
控制器中执行依赖注入基于匹配变量 name 注入范围的$scope
情况下,在这种情况下使用scope
as name 将不起作用。
对于指令的情况,注入是基于位置的,因此您可以命名您的变量a
或b
任何东西。链接功能的指令顺序是
(scope, iElement, iAttrs, controller)
所以第一个元素总是范围对象。
您还可以在此处找到 John Lindquist 对这个问题的一个非常好的视频答案:http: //egghead.io/lessons/angularjs-scope-vs-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接收,而在非依赖注入的情况下,作用域对象作为作用域或任何名称接收。
这种行为的原因是,与控制器不同,指令不使用依赖注入,而是传递由放置在视图后面的控制器创建的范围。这非常棘手,因此您可以在不同的范围内重用您的指令。
$
in"$scope"
表示范围值被注入到当前上下文中。
$scope
是由 提供的服务$scopeProvider
。你可以使用 Angular 的内置依赖注入器将它注入到控制器、指令或其他服务中:
module.controller(function($scope) {...})
这是简写
module.controller(['$scope', function($scope) {...}])
但是,scope
可以是任何东西,它是一个函数参数名称,可以是foo
or a12342saa
。
function link( scope, element, attributes ) {
// Only scope
}
“$scope”中的“$”表示范围值被注入到当前上下文中。但是,并非所有对作用域的引用都基于依赖注入。