Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/416.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 错误未知提供程序:$scopeProvider<;-$使用$injector将$scope注入控制器时的作用域_Javascript_Angularjs_Dependency Injection_Scope_Angularjs Injector - Fatal编程技术网

Javascript 错误未知提供程序:$scopeProvider<;-$使用$injector将$scope注入控制器时的作用域

Javascript 错误未知提供程序:$scopeProvider<;-$使用$injector将$scope注入控制器时的作用域,javascript,angularjs,dependency-injection,scope,angularjs-injector,Javascript,Angularjs,Dependency Injection,Scope,Angularjs Injector,以这种方式使用DI时: var MainController = function MainController($scope) { //use $scope here }; MainController.$inject = ["$scope"]; 它可以工作,但是,当它像这样使用时: var MainController = function MainController($injector) { var $scope = $injector.get("$scope"); }; Ma

以这种方式使用DI时:

var MainController = function MainController($scope) {
  //use $scope here
};
MainController.$inject = ["$scope"];
它可以工作,但是,当它像这样使用时:

var MainController = function MainController($injector) {
  var $scope = $injector.get("$scope");
};
MainController.$inject = ["$injector"];
这将导致错误:


错误:[$injector:unpr]未知提供程序:$scopeProvider我已经在gitter上回复了您,但是在这里回答以及回答可能会帮助其他有相同问题的人


当您为Angular提供一个要调用的函数,该函数的值将从依赖项注入(例如服务、控制器等)中派生,Angular将:

  • 在函数对象上查找
    $inject
    属性,该属性应该是作为字符串的依赖项名称数组(例如
    ['$scope']
  • 如果
    $inject
    未定义,它将使用函数定义的参数(在大多数情况下都有效,除非您缩小代码并且名称被损坏)
因此,简而言之,它将查找您在DI容器中指定的名称

DI容器中不存在
$scope
,只有
$rootScope
存在。因此,如果您直接访问注入器并询问
$scope
的实例,您将得到您在这里看到的注入错误

在它工作的示例中,您不是直接访问喷油器,而是依靠Angular解决如何创建控制器的问题。这是一个微妙的区别,但在这种情况下,这是一个重要的区别。在Angular中,当创建控制器实例时,它会将
$scope
解析为调用
$rootScope.$new()
的结果(即在单元测试中手动实例化控制器时的操作)

我希望这能解释为什么你的例子不起作用

至于第二个问题,您可以通过执行以下操作手动获取范围实例:


var$scope=$injector.get(“$rootScope”)。$new();


但现在我们开始走上一条相当黑暗的道路。。。直接注入
$injector
是非常不典型的。如果可以的话,我会避免的。你需要这样做有什么原因吗?

我直接注入
$injector
,因为在我的应用程序中,我有很多依赖项,所以函数参数变得非常长,所以通过注入
$injector
我可以使它垂直,我想我现在只注入
$scope
$injector
。好的,我也遇到过类似的情况,虽然这通常是你需要开始重构的标志,但如果你不能摆脱它,你可以将你的控制器参数放在新的行上:`函数MyController(someParam,anotherParam){}`……所以多行代码片段在注释中不能很好地工作:)