为什么变量名称"$ scope"是必需的?

Kac*_*acy 10 javascript angularjs

我是Javascript的新手(刚刚完成了Eloquent Javascript这本书),目前正在阅读O'Reilly的AngularJS.从书中获取这些小代码片段让我疯了几个小时,让我陷入了兔子洞,以为我在设置环境时搞砸了.AngularJS书中提供的代码与我输入的代码的唯一区别在于我在TextController函数中省略了"$ scope"中的'$'.将'$'放回去允许代码工作.

这是我最初抛弃它的原因:哦,'$ scope'只是函数本地的变量名.像任何其他编程语言(如Java或C++)一样,因为这个参数只是一个局部变量,我可以将它命名为我想要的任何名称,因为传递给函数的任何参数都将通过值传递.

请更正我的推理并解释为什么参数的名称必须是"$ scope".

<!doctype html>
<html ng-app>

<body ng-controller="TextController">

  <p>{{someText}}</p>

  <script src="angular.min.js"></script>

  <script>
    function TextController($scope) {
      $scope.someText = 'You have started your journey.';
    }
  </script>

</body>

</html>
Run Code Online (Sandbox Code Playgroud)

cee*_*yoz 6

这由Angular进样器处理.

http://docs.angularjs.org/api/auto/service/ $ injector

在JavaScript中,在函数上调用toString()会返回函数定义.然后可以解析定义并提取函数参数.注意:这不适用于缩小和混淆工具,因为这些工具会更改参数名称.

http://docs.angularjs.org/guide/di

给定一个函数,注入器可以通过检查函数声明和提取参数名称来推断要注入的服务的名称.在上面的示例中,$ scope和greeter是两个需要注入函数的服务.

  • 哦,我知道什么是依赖注入,但我从来没有猜到Angular在函数上使用toString()来提取名称.所以在某些时候它实际上特别寻找"$ scope".第一个链接真的为我清理了它.谢谢! (2认同)

Che*_*niv 6

之前的两个答案都是正确的,只要您知道如果以这种方式声明控制器,就可以"覆盖"默认行为:

module.controller("ControllerName",["$scope",function( custom_name ){ ... }]);
Run Code Online (Sandbox Code Playgroud)

例:

var app = angular.module("myApp",[]);

app.controller("TextController",["$scope",function(glue){
    glue.name1 = "John";
    glue.name2 = "Paul";
    glue.name3 = "George";
    glue.name4 = "Ringo";
}]);
Run Code Online (Sandbox Code Playgroud)

然后:

<div ng-controller="TextController">
    Hello {{ name1 }}, {{ name2 }}, {{ name3 }}, {{ name4 }}!
</div>
Run Code Online (Sandbox Code Playgroud)

在这里工作:http://jsfiddle.net/d4M2P/

  • 伟大的补充和我的+1. (2认同)