【问题标题】:angular.injector.invoke makes my controller undefinedangular.injector.invoke 使我的控制器未定义
【发布时间】:2016-06-17 14:45:13
【问题描述】:

在学习 Angular 时,请阅读 a blog 详细说明

我们可以使用 angular.injector() 访问控制器外部的工厂/服务,但是当我尝试这个时,它给出了我的 主控制器未定义 错误并且一切都停止工作。

查看带有注释的罪魁祸首代码块的working plunker。下面是使用angular.injector(["app"]).invoke的行的主要代码

var app = angular.module('AlphaModule', []);
// service added 
app.service('tea', function(){
    return {
        teaType: function(teaType) {
            console.log('Service => Morning tea must be ' + teaType);
        },
        sayHello: function(msg) {
            console.log('Service  => Hello ' + msg);
        }
    };
});

// ERROR in console when uncomment this code block
angular.injector(["app"]).invoke(function(tea){
    tea.sayHello('Yellow');
});

// main controller definition
var AlphaController = function($injector, tea) {
    var vm  = this;
    vm.timeNow = new Date().getTime();
    ....
};

app.controller('AlphaController', AlphaController );

请强调我在这里遗漏了什么/做错了什么?

我的猜测:

我还读到 $injector 是单例。这究竟意味着什么?我们能不能只用一次$injector!或者这可能是我在.controller 中也使用过 $injector 的问题

【问题讨论】:

  • 虽然接受的答案是正确的,但它并没有像您认为的那样做。 angular.injector 创建一个新的注入器,它不会检索与您已经创建的应用程序关联的注入器。服务是单例的,因为它们每个注入器只创建一次。因此,invoke 中的 tea 服务与应用中的 tea 服务不同。
  • 您能否举例说明“您调用中的茶服务与您的应用程序中的茶服务不同”。我真的很想学习。
  • 当您的应用程序被引导时,将创建一个注入器并在您的应用程序时关联。您的应用程序中使用的服务只会创建一次(每个注入器,即每个应用程序)。 angular.injector 创建一个新的注入器并将再次创建所有需要的服务。所以服务实例不会相同,如果你的服务保持任何状态都会导致问题。

标签: angularjs singleton-type


【解决方案1】:

您提到的模块名称有误。模块名称实际上是 AlphaModule 而不是 app

angular.injector(["AlphaModule"]).invoke(function(tea){
    tea.sayHello('Yellow');
});

【讨论】:

  • 非常感谢。我不明白为什么错误不是很清楚:(
  • 请你看看我之前的问题 ==> stackoverflow.com/questions/37850557/…
  • 这可能会产生误导。请参阅我对这个问题的评论。
猜你喜欢
  • 2014-02-26
  • 1970-01-01
  • 1970-01-01
  • 2019-09-21
  • 2015-08-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多