服务构造函数参数

时间:2015-01-06 12:23:05

标签: javascript angularjs constructor angular-services

如果我没错,那么在角度服务中定义一个将成为服务对象构造函数的函数

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的第一个值而且永远不会改变吗?

2 个答案:

答案 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