为什么Angular Controller需要" $ scope"

时间:2014-05-22 13:00:49

标签: javascript angularjs function

我通常知道函数实现可以有任何函数参数的名称,只要它以正确的顺序提供。这使得函数从外部世界抽象出来,并且本地名称对输出没有影响。实施者拥有局部变量的所有权利。但是在Angular JS中,它似乎与直觉相反:

function Controller($scope)
{
    $scope.name = "Something";
}

如果我把“bar”改为“$ scope”,我会收到错误。这不是我们习惯的常规功能。我认为它与DI有关,但任何人都可以解释这个概念吗?我发现很难将其称为“函数”,因为它依赖于外部世界 - 尤其是参数名称。

如果DI是真正的原因,任何人都可以让我知道它是如何被调用的吗?通常情况下,当我想为测试用例模拟一个对象时,我可以认为DI做得很好。在这种情况下,DI扮演什么角色?

在我遇到的DI的正常场景中,传递的参数为函数提供服务,比如说foo displayTime(clock){clock.something}。时间只是该功能的服务。但是在这里我发现,$ scope和框架似乎做了神奇的功能只是表达逻辑的声明方式。

编辑:显然JS minify打破了这个功能,我们需要在How do the function argument names in Angular.js objects connect to other objects?

中做

1 个答案:

答案 0 :(得分:7)

定义控制器的一种方法是:

myApp.controller("TestController", ['$scope', function(bar) {
   // now "bar" is actually the scope variable
}]);

像这样的角度工作的全部原因是它依赖注入的方式。基本上它会查找依赖项(例如$scope)并尝试根据变量的名称注入它们。这意味着如果你将$scope命名为不同的东西,那么它会尝试注入其他项目。 bar不是角度知道如何注入的东西,因此您将获得undefined值而不是您期望的$scope

我上面的例子有效,因为我使用了一个数组来分离将从变量本身注入的变量的名称。现在您不必使用单词$scope,但必须保持变量的顺序相同。 DI的整个概念太复杂,不能在短篇文章中解释,所以我建议在角度的网站上阅读更多关于它的信息:https://docs.angularjs.org/tutorial/step_05

DI点(有角度)

万一你想知道 - 为什么要去解决这个问题呢?为什么不自动将$scope注入列表中的第一个变量?答案是 - 灵活性和定制。使用angular,您可以定义服务和工厂,然后将它们注入控制器。这使您能够定义共享例程,对象甚至自定义控件,然后在任意数量的控制器中使用它们。没有DI - 这一切都不可能。同样,这些都是相当复杂的概念,因此我建议从“它有效”的信念开始,学习服务,然后您可以回过头来阅读更多相关信息。那时我认为DI应该更有意义!

祝你好运!