如何将具有提供程序的功能模块导入到具有提供程序的另一个功能模块?

时间:2017-01-06 11:04:51

标签: angular

有一个我喜欢的功能模块,或者我想将其用作我自己的功能模块的一部分。我想要包含的子模块称为SlimLoadingBarModule。我希望将它作为基础并通过提供我自己的功能来使用它的功能。此外,我的整个应用都可以使用我的LoadingBarComponentLoadingBarService,而不需要了解基础提供商。

所以最后我希望能够像我这样在我的服务中注入它:

@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个实例!

但是我觉得功能模块不可能使用一些额外的底层提供程序并且可能将它们隐藏在应用程序的其余部分中?它甚至可能吗?如果是这样,那么我做错了什么?

1 个答案:

答案 0 :(得分:2)

forRoot()只能在AppModule

中使用
@NgModule({
    imports: [ SlimLoadingBarModule.forRoot() ],

https://angular.io/docs/ts/latest/guide/ngmodule.html#!#core-for-root

  

仅在根应用程序模块forRoot中调用AppModule。在任何其他模块中调用它,特别是在延迟加载的模块中,与意图相反,可能会产生运行时错误。

     

请记住导入结果;不要将它添加到任何其他@NgModule列表中。