gpt4 book ai didi

javascript - 错误未知提供商 : $scopeProvider <- $scope when using $injector to inject $scope into controller

转载 作者:行者123 更新时间:2023-11-27 23:20:29 26 4
gpt4 key购买 nike

以这种方式使用 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"];

这将导致错误:

Error: [$injector:unpr] Unknown provider: $scopeProvider <- $scope

这是一个plunker通过展示错误的示例,请检查替代方案的注释,以查看只有范围而不是自定义服务受此影响。
我找到了这个Angular bug他们谈论在子 $scope 创建之前实例化 Controller Tomer Avni回答,所以:

  1. 为什么第一种注入(inject) $scope 的方法有效,而第二种则不行?
  2. 有没有办法使用依赖注入(inject)的第二种方法使用 $injector 来注入(inject) $scope

最佳答案

我已经在 gitter 上回复了您,但在这里回答可能会帮助其他有同样问题的人。

<小时/>

当你给 Angular 一个要调用的函数,该函数具有从依赖注入(inject)(例如服务、 Controller 等)派生的值时,Angular 将:

  • 在函数对象上查找 .$inject 属性,该属性应该是依赖项名称字符串数组(例如 ['$scope'])。<
  • 如果 $inject 未定义,它将使用函数定义的参数(在大多数情况下有效,除非您缩小代码并且名称被破坏)。

因此,简而言之,它将查找您在 DI 容器中指定的名称。

$scope DI 容器中不存在,只有 $rootScope 存在。因此,如果您直接访问注入(inject)器并请求 $scope 实例,您将收到此处看到的注入(inject)错误。

在它起作用的示例中,您没有直接访问注入(inject)器,而是依赖 Angular 来确定如何创建 Controller 。这是一个细微的差别,但在本例中却是一个重要的差别。在 Angular 中,创建 Controller 实例时,它将把 $scope 解析为调用 $rootScope.$new() 的结果(即手动实例化 Controller 时会执行的操作)在单元测试中)。

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

对于第二个问题,您可以通过执行以下操作来手动获取作用域实例:


var $scope = $injector.get('$rootScope').$new();

但是现在我们开始走上一条相当黑暗的道路...直接注入(inject) $injector 是非常不典型的。如果可以的话我会避免这种情况。您需要这样做有什么理由吗?

关于javascript - 错误未知提供商 : $scopeProvider <- $scope when using $injector to inject $scope into controller,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35409855/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com