【发布时间】: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创建一个新的注入器并将再次创建所有需要的服务。所以服务实例不会相同,如果你的服务保持任何状态都会导致问题。