服务构造函数参数

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'])