Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/EmptyTag/154.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么角度控制器需要$范围“;_Javascript_Angularjs_Function - Fatal编程技术网

Javascript 为什么角度控制器需要$范围“;

Javascript 为什么角度控制器需要$范围“;,javascript,angularjs,function,Javascript,Angularjs,Function,我通常了解到,函数实现可以有函数参数的任何名称,只要以正确的顺序提供。这使得从外部抽象的函数和本地名称对输出没有影响。实现者拥有局部变量的所有权限。然而,在Angular JS中,有如下内容似乎是违反直觉的: function Controller($scope) { $scope.name = "Something"; } 如果我把“bar”改为“$scope”,我会得到一个错误。这不是我们习惯的正常功能。我相信这与DI有关,但有人能解释这个概念吗?我发现很难将其称为“函数”,因为它

我通常了解到,函数实现可以有函数参数的任何名称,只要以正确的顺序提供。这使得从外部抽象的函数和本地名称对输出没有影响。实现者拥有局部变量的所有权限。然而,在Angular JS中,有如下内容似乎是违反直觉的:

function Controller($scope)
{
    $scope.name = "Something";
}
如果我把“bar”改为“$scope”,我会得到一个错误。这不是我们习惯的正常功能。我相信这与DI有关,但有人能解释这个概念吗?我发现很难将其称为“函数”,因为它依赖于外部世界,尤其是参数名称

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

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


编辑:显然JS minify破坏了这一功能,我们需要这样做,一种定义控制器的方法如下:

myApp.controller("TestController", ['$scope', function(bar) {
   // now "bar" is actually the scope variable
}]);
angular这样工作的全部原因是因为它执行依赖注入的方式。基本上,它会查找依赖项(例如
$scope
),并尝试根据变量的名称注入依赖项。这意味着,如果您将
$scope
命名为不同的名称,那么它将尝试注入其他项
bar
不是angular知道如何注入的东西,因此您将获得一个
未定义的
值,而不是您期望的
$scope

我上面的例子之所以有效,是因为我使用了一个数组将要注入的变量的名称从变量本身中分离出来。现在您不必使用单词
$scope
,但必须保持变量的顺序相同。DI的整个概念太复杂,无法在一篇短文中解释,因此我建议在angular的网站上阅读更多关于DI的内容:

DI点(角度)

如果你想知道,为什么要这么麻烦?为什么不直接将
$scope
自动注入列表中的第一个变量?答案是——灵活性和定制。使用angular,您可以定义服务和工厂,然后将它们注入控制器。这使您能够定义共享例程、对象甚至自定义控件,然后在任意多个控制器上使用它们。没有DI,这一切都是不可能的。同样,这些都是相当复杂的概念,所以我建议从“it有效”的信念开始,学习服务,然后你可以回头阅读更多关于它的内容。在这一点上,我认为DI应该更有意义


祝你好运

有趣。基本上你的意思是,这个函数是由角度而不是外部世界调用的?它不是一个纯粹的JS函数?@Nishant您可以根据定义调用该函数,但显然对您没有多大好处。无论如何,您应该使用drew_w在此提供的语法,因为这也意味着您可以在不破坏功能的情况下安全地缩小代码。@Nishant它使用DI注入变量,但它仍然是一个纯javascript函数。我建议阅读更多关于DI的内容,以了解这里发生了什么!是的,我的意思是DI对角度框架有特殊用途。好的,我会检查DI概念。@Nishant Angular使用它的注入器($injector)进行大多数实例化和调用您在Angular应用程序中定义的函数。。。喷油器是一个IoC容器。DI it self并没有做任何这一切,因为它只是指定了一个概念,用于从外部提供它所需要的对象/服务。IoC容器意味着您可以自动化整个创建过程。因此,您可能还应该稍微了解一下IoC容器。在JavaScript中,我们无法通过“类型”或“接口”来解决问题,因此我们使用名称。Angular实际上会计算参数(使用Function.toString)名称并注入正确的资源,这是您在开始使用Angular时所学到的令人困惑的事情之一!请参阅此处:“在我遇到的DI的正常场景中,传递的参数为函数提供服务”。。。在角度上也是如此,但是范围有点特殊。。。它详细介绍了作用域,可能更强调了应该如何使用它们,但您也可以插入自己的时钟服务,定义为:myApp.service('clock',['otherDependency',function(od){this.something=“Im a clock!”;});