【问题标题】:Instantiate service on startup in Angular2在Angular2中启动时实例化服务
【发布时间】:2017-05-27 15:52:47
【问题描述】:

我有一个(单例)服务,它在构造函数中包含一些代码,应该在启动后直接运行。这意味着必须在加载应用程序时立即创建一个实例。

实例化服务的一种可能性是将其放入应用组件的构造函数中:

export class AppComponent {

  constructor(private mySercive: MyService
...

但由于我从未在此组件中使用 myService,我会收到类似 mySerive is not used 的警告,并且我团队中的其他人可能会删除该服务。有没有办法在应用模块中实例化服务?

【问题讨论】:

    标签: angular


    【解决方案1】:

    您可以提供一个虚拟APP_INITIALIZER 并将其作为dependency 传递

    @NgModule({
      providers: [{provide: APP_INITIALIZER, useMulti: true, deps: [MyService], useFactory: (myService) => null}]
    

    【讨论】:

    • useMulti 在 Angular 8 中不再存在:它已被简单地重命名为 multiuseFactory 也应该声明一个返回函数的函数,如下所示:useFactory: (myService) => () => null
    • 对于那些面临TypeError: this.appInits[i] is not a function 的人,@PaulSiersma 的评论是解决方案:)
    【解决方案2】:

    当您将服务放入 NgModule 声明 时,意味着您从那里自己实例化服务...

    当你使用这个语法时:

    constructor(private mySercive: MyService
    

    在打字稿中它只是告诉编译器 TYPECASTING 它对服务没有任何作用......

    检查是否真的只是打字稿相关的东西...... 从构造函数中删除它并在具有相同类型转换的变量上创建...

    喜欢这个

    class ComponentClass {
        mySercive: MyService;
    }
    

    【讨论】:

    • 你确定吗?我只是在服务的构造函数中添加了一个console.log,仅当我在组件的构造函数中添加服务时才会打印。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-15
    相关资源
    最近更新 更多