为什么Angular Controller需要"$ scope"

Nis*_*ant 6 javascript function angularjs

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

function Controller($scope)
{
    $scope.name = "Something";
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

编辑:显然JS minify打破了这个功能,我们需要做的是如何将Angular.js对象中的函数参数名称连接到其他对象?

dre*_*w_w 7

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

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

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

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

DI点(角度)

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

祝你好运!