【问题标题】:Initialize a non injected angular service初始化非注入角度服务
【发布时间】:2015-04-05 06:49:14
【问题描述】:

我有一个角度服务,它在其构造函数中侦听 $rootscope 上的事件。

此服务未注入应用程序的任何位置,因此未初始化。 为了解决这个问题,我们只是注入它而不是在另一个服务中使用它,只是为了让它“更新”。

有什么方法可以初始化服务,而不必将其注入其他服务/控制器/指令中?

【问题讨论】:

  • 使用module.run() 进行初始化;如果您想将逻辑封装在服务中,请让 run() 依赖于该服务并调用 init() 函数(或者像您一样使用构造函数)。
  • 谢谢!工作得很好!如果您将其放在答案中,我可以接受!我不太明白如何使run() 依赖于我的服务。我只是给了它一个具有$inject 属性的函数指针。

标签: angularjs angularjs-service


【解决方案1】:

一般来说,Angular 会为您提供module.run(fn) API 来进行初始化。 fn 参数是完全可注入的,所以如果你有服务,例如myService,它暴露了一个init() 方法,你可以将它初始化为:

angular.module(...).run(['myService', function(myService) {
    myService.init();
}]);

如果服务初始化代码放在服务构造函数中,即:

angular.module(...).service(function() {
    ...initialization code...
});

...那么在run() 方法中声明对服务的依赖就足够了,即:

angular.module(...).run(['myService', function() {
    // nothing else needed; the `myService` constructor, containing the
    // initialization code, will already have run at this point
}]);

其实你可以这样缩写:

angular.module(...).run(['myService', angular.noop]);

(旁注:我觉得这种模式有点尴尬;如果服务只包含初始化代码,只需在run() 函数中直接实现初始化代码。无论如何,您可以将多个run() 函数附加到每个模块。)

【讨论】:

  • 好吧,我只提供初始化函数。我想它不再需要成为一项服务。
猜你喜欢
  • 2018-08-20
  • 1970-01-01
  • 2019-01-11
  • 1970-01-01
  • 2023-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多