【发布时间】:2013-10-10 06:29:13
【问题描述】:
在 Angularjs 中,是否有特定的理由在控制器中使用 $scope 并在指令链接功能中使用 scope(没有 "$")?这只是一个约定还是其他什么?
【问题讨论】:
-
这只是一个变量名,所以不是。
-
类似问题here
标签: angularjs
在 Angularjs 中,是否有特定的理由在控制器中使用 $scope 并在指令链接功能中使用 scope(没有 "$")?这只是一个约定还是其他什么?
【问题讨论】:
标签: angularjs
当您在控制器中执行$scope 时,依赖注入会根据匹配变量名称$scope 来注入作用域,在这种情况下使用scope 作为名称将不起作用。
对于指令的情况,注入是基于位置的,因此您可以将变量命名为 a 或 b 或任何名称。链接函数的指令顺序为
(scope, iElement, iAttrs, controller)
所以第一个元素总是范围对象。
【讨论】:
scope 确实只是惯例。” (我找不到任何好的解释为什么这里也没有使用$scope,如果只是为了保持一致性)
您还可以在此处找到 John Lindquist 对这个问题的一个非常好的视频答案: http://egghead.io/lessons/angularjs-scope-vs-scope.
【讨论】:
控制器、指令、工厂、过滤器、服务、动画、配置和运行等模块工厂方法通过依赖注入 (DI) 接收参数。在 DI 的情况下,您注入带有美元前缀的 scope 对象,即 $scope。原因是 injected arguments 必须与 inject-able objects 的名称匹配,后跟美元 ($) 前缀。
例如,您可以将范围和元素对象注入到控制器中,如下所示:
module.controller('MyController', function ($scope, $element) { // injected arguments });
当指令链接器函数等方法不通过依赖注入接收参数时,您只需传递 scope object 而不使用美元前缀,即 scope。原因是传递的参数被其调用者接收。
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 是$scopeProvider 提供的服务。您可以使用 Angular 内置的依赖注入器将其注入到控制器、指令或其他服务中:
module.controller(function($scope) {...})
这是的简写
module.controller(['$scope', function($scope) {...}])
但是,scope 可以是任何东西,它是一个函数参数名称,可以是foo 或a12342saa。
function link( scope, element, attributes ) {
// Only scope
}
【讨论】:
“$scope”中的“$”表示范围值被注入到当前上下文中。但是,并非所有对作用域的引用都基于依赖注入。
【讨论】: