gpt4 book ai didi

javascript - 服务构造函数参数

转载 作者:行者123 更新时间:2023-12-03 11:07:06 24 4
gpt4 key购买 nike

如果我没记错的话,在 Angular 中,服务定义了一个函数,该函数将成为服务对象的构造函数

angular.module('HelloModule', []).service('MyService', function(myParam){
this.myThing = myParam;
this.getThing = function () { return this.myThing; };
});

现在,由于它应该是一个单例,所以我认为只有在第一次实例化服务时才会调用构造函数,因此 this.myThing = myParam; 只会在创建时间。

当服务已经存在于应用程序中时,因为某个地方已经需要/注入(inject)了构造函数,它是否仍然被调用?

我知道当实例已经存在时,Angular 将返回实例本身,但是语句 this.myThing = myParam; 是否会被跳过?

编辑
更具体地说,我正在使用 Angular ui Router,并且在我的构造函数中我有

angular.module('HelloModule', []).service('MyService', function($state){
this.state = $state;
});

每次我使用不同 Controller 的服务时,this.state 都会设置为正确的值。这正是我不明白的地方。难道 this.state 不应该在实例化时设置为 $state 的第一个值并且永远不会改变吗?

最佳答案

编辑

实际上,我认为如果您不想更改或扩展其属性,则无需将 $state 注入(inject)另一个服务并将其绑定(bind)到另一个属性。只需将其注入(inject)到任何需要的地方即可。

因为 $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 了解您将尝试依赖项注入(inject)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; };
}]);

也就是说,您尝试注入(inject) 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'])

关于javascript - 服务构造函数参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27798619/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com