更新(Angular 6 +)
创建单例服务的推荐方法已更改。现在建议@Injectable
在服务的装饰器中指定应在“根”中提供它。这对我来说很有意义,并且不再需要在您的模块中列出所有提供的服务。您只需在需要时导入服务,然后它们就会在适当的位置进行注册。您也可以指定一个模块,以便仅在导入模块时才提供。
@Injectable({
providedIn: 'root',
})
export class ApiService {
}
更新(角度2)
我认为,使用NgModule的方法是在其中创建一个带有您的服务类的'CoreModule',并在模块的提供程序中列出该服务。然后,将核心模块导入到主应用程序模块中,该模块将为在其构造函数中请求该类的所有子级提供一个实例:
CoreModule.ts
import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { ApiService } from './api.service';
@NgModule({
imports: [
CommonModule
],
exports: [ // components that we want to make available
],
declarations: [ // components for use in THIS module
],
providers: [ // singleton services
ApiService,
]
})
export class CoreModule { }
AppModule.ts
import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { AppComponent } from './app.component';
import { CoreModule } from './core/core.module';
@NgModule({
declarations: [ AppComponent ],
imports: [
CommonModule,
CoreModule // will provide ApiService
],
providers: [],
bootstrap: [ AppComponent ]
})
export class AppModule { }
原始答案
如果您在中列出了提供程序bootstrap()
,则无需在组件装饰器中列出它们:
import { ApiService } from '../core/api-service';
@Component({
selector: 'main-app',
templateUrl: '/views/main-app.html',
// DO NOT LIST PROVIDERS HERE IF THEY ARE IN bootstrap()!
// (unless you want a new instance)
//providers: [ApiService]
})
export class MainAppComponent {
constructor(private api: ApiService) {}
}
实际上,将您的类列出在“提供者”中会创建一个新的实例,如果任何父组件已经列出了它,则子级不需要这样做,如果他们这样做了,他们将获得一个新实例。
UserService
和添加FacebookService
到providers
其他任何地方?