以这种方式使用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 <-$ scope
这里有一个plunker用一个例子,展示错误,检查是否有替代的评论看,只有不定制服务受此影响范围。
我发现了这个Angular错误,他们谈到在Tomer Avni回答创建子$ scope之前实例化控制器,所以:
$scope
工作而第二种却没有?$injector
进行注入$scope
吗?我已经回复了您,但在这里回答可能会对其他有相同问题的人有所帮助。
当您给Angular一个要调用的函数具有将从依赖项注入派生的值(例如服务,控制器等)时,Angular将:
.$inject
在函数对象上查找一个属性,该属性应该是字符串形式的依赖项名称(例如['$scope']
)。$inject
未定义,它将使用函数定义的参数(在大多数情况下都可以使用,除非缩小代码并弄乱名称)。因此,简而言之,它将查找您在DI容器中指定的名称。
$scope
在DI容器中不存在,仅$rootScope
存在。因此,如果您直接访问注入器并请求的实例$scope
,您将在这里看到注入错误。
在工作的示例中,您不是直接访问注入器,而是依靠Angular来研究如何创建控制器。这是一个细微的差异,但是在这种情况下是一个重要的差异。在Angular中,创建控制器实例时,它将解析$scope
为调用结果$rootScope.$new()
(即,在单元测试中手动实例化控制器时将执行的操作)。
我希望这可以解释您的示例为何无效的原因。
至于第二个问题,您可以通过执行以下操作来手动获取范围实例:
var $scope = $injector.get('$rootScope').$new();
但是现在我们开始走上一条模糊的道路……$injector
直接注入是非常不典型的。如果可以的话,我会避免的。您有理由这样做吗?
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句