有一个我喜欢的功能模块,或者我想将其用作我自己的功能模块的一部分。我想要包含的子模块称为SlimLoadingBarModule
。我希望将它作为基础并通过提供我自己的功能来使用它的功能。此外,我的整个应用都可以使用我的LoadingBarComponent
和LoadingBarService
,而不需要了解基础提供商。
所以最后我希望能够像我这样在我的服务中注入它:
@Injectable()
export class LoadingBarService {
constructor(private slimLoadingBarService: SlimLoadingBarService) {}
start() {}
finish() {}
/**/
}
为此,我必须以某种方式将其包含在我的模块中
import { NgModule, ModuleWithProviders } from '@angular/core';
import { SlimLoadingBarModule } from 'ng2-slim-loading-bar';
import { LoadingBarComponent } from './loading-bar.component';
import { LoadingBarService } from './loading-bar.service';
@NgModule({
imports: [ SlimLoadingBarModule.forRoot() ],
declarations: [ LoadingBarComponent ],
exports: [ LoadingBarComponent ]
})
export class LoadingBarModule {
static forRoot(): ModuleWithProviders {
return {
ngModule: LoadingBarModule,
providers: [ LoadingBarService ]
};
}
}
模板只包含SlimLoadingBar
问题
虽然我自己的服务在我的模块中都是单身,但我不能让SlimLoadingBarService
成为单身人士。我总是得到两个实例,如果我没有将它注入我的服务中,我得到1,但后来我无法使用它。
此外,我知道我的服务和组件正在运行,因为我以某种方式让它们工作了一次,但我没有找到模块和导入的逻辑足以保持它们像这样。
我通过SharedModule
,通过AppModule
尝试了各种解决方案,但无论我做什么,当我尝试将其注入我的LoadingBarService
时,我有2个实例!
但是我觉得功能模块不可能使用一些额外的底层提供程序并且可能将它们隐藏在应用程序的其余部分中?它甚至可能吗?如果是这样,那么我做错了什么?
答案 0 :(得分:2)
forRoot()
只能在AppModule
@NgModule({
imports: [ SlimLoadingBarModule.forRoot() ],
https://angular.io/docs/ts/latest/guide/ngmodule.html#!#core-for-root
仅在根应用程序模块
forRoot
中调用AppModule
。在任何其他模块中调用它,特别是在延迟加载的模块中,与意图相反,可能会产生运行时错误。请记住导入结果;不要将它添加到任何其他@NgModule列表中。