首页 > 解决方案 > 未创建外部模块的服务实例

问题描述

ExternalModule在我的AppModule. 我的外部模块中的服务构造函数没有被调用。下面是我的两个模块和服务的代码,

// AppModule
import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';

import { AppComponent } from './app.component';
import { ExternalModule } from './external/external.module';


@NgModule({
  declarations: [
    AppComponent
  ],
  imports: [
    BrowserModule,
    ExternalModule
  ],
  providers: [],
  bootstrap: [AppComponent]
})
export class AppModule { }

// ExternalModule
import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { NewService } from './new.service';

@NgModule({
  imports: [
    CommonModule
  ],
  providers: [
    NewService
  ],
  declarations: []
})
export class ExternalModule { }

// NewService
import { Injectable } from "@angular/core";

@Injectable()
export class NewService {
    constructor() {
       console.log('New service constructed');
    }
}

我希望NewService在我的应用程序加载时调用构造函数。查找以下示例stackblitz

是否仅通过在模块的提供者上注册来创建实例?

根据角度 v5 文档,

providers 数组告诉 Angular 创建一个单一的、共享的实例HeroService并注入到任何需要它的类中。

这是否意味着即使我们在 providers 数组中注册了服务,我们是否仍然需要至少请求一次才能创建该服务的单例实例?

标签: angular

解决方案


通过写这行

  providers: [
    NewService
  ],

您实际上是在注册您的服务,这并不意味着它会创建服务实例。

当您在其他服务、组件或指令或管道中请求服务实例时,它将创建实例。

因此,如果您想创建服务实例,只需在您的应用程序组件中执行此操作即可。

 //app.component.ts
 constructor(
    private newservice: NewService )

当您在 approot 级别注册服务时,只会创建服务实例,并将该实例提供给应用程序中请求它的所有组件。


推荐阅读