服务构造函数参数
Service constructor parameter
如果我没记错的话,在 angular 中,服务定义了一个函数,该函数将成为服务对象的构造函数
angular.module('HelloModule', []).service('MyService', function(myParam){
this.myThing = myParam;
this.getThing = function () { return this.myThing; };
});
现在,由于它应该是一个单例,我很难仅在第一次实例化服务时调用构造函数,因此 this.myThing = myParam;
仅在创建时调用。
当服务已经存在于应用程序中时,因为某处已经 required/injected 构造函数是否仍然被调用?
我知道当实例已经存在时 angular 将 return 实例本身,但是语句 this.myThing = myParam;
是否会被跳过呢?
编辑
更具体地说,我正在使用 angular ui Router 并且在我的构造函数中我有
angular.module('HelloModule', []).service('MyService', function($state){
this.state = $state;
});
每次我使用来自不同控制器的服务时,this.state
都设置为正确的值。
这正是我不明白的。 this.state
不应该在实例化时设置为 $state
的第一个值并且永远不会改变吗?
服务不是'supposed to be a singleton',工厂是单例,服务是实例。它们的工作方式相同,唯一的区别是:
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
不会被跳过,它会在实例化时设置为你的depedency myParam
。
编辑
实际上,如果您不想更改或扩展它的属性,我认为没有必要将 $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'])
如果我没记错的话,在 angular 中,服务定义了一个函数,该函数将成为服务对象的构造函数
angular.module('HelloModule', []).service('MyService', function(myParam){
this.myThing = myParam;
this.getThing = function () { return this.myThing; };
});
现在,由于它应该是一个单例,我很难仅在第一次实例化服务时调用构造函数,因此 this.myThing = myParam;
仅在创建时调用。
当服务已经存在于应用程序中时,因为某处已经 required/injected 构造函数是否仍然被调用?
我知道当实例已经存在时 angular 将 return 实例本身,但是语句 this.myThing = myParam;
是否会被跳过呢?
编辑
更具体地说,我正在使用 angular ui Router 并且在我的构造函数中我有
angular.module('HelloModule', []).service('MyService', function($state){
this.state = $state;
});
每次我使用来自不同控制器的服务时,this.state
都设置为正确的值。
这正是我不明白的。 this.state
不应该在实例化时设置为 $state
的第一个值并且永远不会改变吗?
服务不是'supposed to be a singleton',工厂是单例,服务是实例。它们的工作方式相同,唯一的区别是:
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
不会被跳过,它会在实例化时设置为你的depedency myParam
。
编辑
实际上,如果您不想更改或扩展它的属性,我认为没有必要将 $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'])