如果我没错,那么在角度服务中定义一个将成为服务对象构造函数的函数
angular.module('HelloModule', []).service('MyService', function(myParam){
this.myThing = myParam;
this.getThing = function () { return this.myThing; };
});
现在,因为它应该是单例,所以我很难在第一次实例化服务时调用构造函数,因此只在创建时调用this.myThing = myParam;
。
当服务已经存在于应用程序中因为已经需要/注入某个地方时,构造函数是否仍然被调用?
我知道当实例已经存在时,angular将返回实例本身,但是语句this.myThing = myParam;
将被跳过或不跳过?
修改
更具体一点,我使用 angular ui Router 并在我的构造函数中使用
angular.module('HelloModule', []).service('MyService', function($state){
this.state = $state;
});
每次我使用来自不同控制器的服务时,this.state
都会设置为正确的值。
这正是我无法理解的。在实例化时不应该this.state
设置为$state
的第一个值而且永远不会改变吗?
答案 0 :(得分:1)
修改强>
Actualy,我认为如果您不想更改或扩展其属性,则无需将$ state注入另一个服务并将其绑定到另一个属性。只需将它注入任何您需要的地方。
因为$ satate是一个提供者,它将一直有效,直到它没有被克隆。如果你使用this.state = angular.extend({},$ state)它将不受限制。你可以为每个服务定义获得不同的状态提供者,它可能会导致递归问题。
<强>旧强>
你不能像那样传递 myParam ,使用如下
angular.module('HelloModule', []).service('MyService', [function(){
var myThing;
this.init = function(myParam){
myThing = myParam;
}
this.getThing = function () { return this.myThing; };
}]);
//in any other services, directives controllers etc call servce
var params = {}
var servise = new MyService.init(params)
在你的代码中,angular会理解你会尝试依赖注入 myParams
如下所示
angular.module('HelloModule', []).service('MyService', ['$rootScope', '$http', function($rootScope, $http){
var myThing;
this.init = function(myParam){
myThing = myParam;
}
this.getThing = function () { return this.myThing; };
}]);
即您已尝试注入myParams,例如$ rootScope,$ http等。
据我了解,你会尝试这样做。
angular.module('HelloModule', ['ui.router']).service('MyService', ['$state', function($state){
this.state = $state;
this.getThing = function () { return this.myThing; };
}]);
//in your app
angular.module('app',['HelloModule'])
答案 1 :(得分:0)
服务不应该“单身”,工厂是单身,服务是实例。他们都以同样的方式工作唯一的区别是:
var service = (function(){
var serviceConstructor = function(){}; //the constructor in your question
return new service;
}();
和
var factory = (function(){
return { foo: 'bar'};
}();
这就是你可以在构造函数中使用this
的原因。
服务只会被实例化一次,然后全局使用同一个实例....
在您的示例中,有一个拼写错误,您正在返回this.myThing
,但确定范围为var myThing
,因此它不返回任何内容。
要回答您的问题myThing
不会被跳过,它会在实例化时设置为您的依赖myParam
。