Angular2从子模块导入并声明全局服务

时间:2017-02-06 09:11:28

标签: angular angular2-services angular2-modules

我有一个有趣的问题。我有2个模块。 app.module.ts(AppModule)和listings.module.ts(ListingsModule)。 ListingsModule有一个服务,我们称之为服务A. A需要是一个单一的全局服务,这意味着所有其他组件和服务都需要能够与同一个A进行交互。

为此,我首先尝试在ListModule中声明A作为提供者,但是这没有按预期工作,因为它仅被声明为用于RichmondModule下的组件和服务的单例,但我还需要在其他模块下使用它并在AppModule下。因此,我得出结论,我需要从ListingsModule导出此服务并导入并在AppModule下提供此服务,但这不能按预期工作。

A是ListingsStoreService。

//Stores
import { ListingsStoreService }             from './shared/listings-store.service';

//Modules
import { SharedModule }                                 from './../shared/shared.module';
import { HeaderModule }                                 from './../header/header.module';

@NgModule({
    imports: [
        SharedModule,
        HeaderModule,
        ListingsRoutingModule
    ],
    declarations: [
        ListingsComponent
    ],
    exports: [
        ListingsStoreService
    ],
    providers: [        ]
})
export class ListingsModule {
}

以下代码要求我声明或导入ListingsStoreService,以便它可以导出。如果我声明ListingsStoreService然后它给我另一个错误。我显然只能提供这项服务。

这里的正确方法是什么?我如何使这项工作?

3 个答案:

答案 0 :(得分:1)

它的一些模块(例如RouterModule)的角度是允许通过名为" forRoot"的静态函数创建同一模块的两个版本。按照惯例," forChild" " forRoot"可以包含全局服务,例如" ListingsStoreService"在它的提供者数组中," forChild"会省略它。然后你可以调用" ListingsModule.forRoot()"在AppModule导入数组中,并调用" ListingsModule.forChild()"在其他地方你需要" ListingsModule"。

@NgModule({
imports: [
    SharedModule,
    HeaderModule,
    ListingsRoutingModule
],
declarations: [
    ListingsComponent
]
})
export class ListingsModule {
    static forRoot() : ModuleWithProviders {
        return {
            ngModule: ListingsModule,
            providers: [ ListingsStoreService ]
        };    
    };

    static forChild() : ModuleWithProviders {
        return {
             ngModule: ListingsModule,
             providers: []
        };
    };
};

答案 1 :(得分:0)

您的ListingsStoreService必须在

中导入
imports: [
    SharedModule,
    HeaderModule,
    ListingsRoutingModule,
    ListingsStoreService
],

我认为这是你的问题。你能试试吗?我已经写了一个评论,但我需要50个声誉...所以这里是一个答案我不知道100%是否有效。

答案 2 :(得分:0)

它应该没有特殊配置。默认情况下,服务具有全局范围(只要声明它们的模块被急切加载)。您的初始配置(您在问题中描述的)应该有效。

platform :ios, ‘8.0’ use_frameworks! target 'BALKISFS' do pod 'Telegram-iOS-SDK' end

的提供商中声明您的服务
ListingsModule

然后在@NgModule({ providers: [ ListingsStoreService ] }) export class ListingsModule { } 中导入ListingsModule

AppModule

NB。 @NgModule({ imports: [ ListingsModule ] }) export class AppModule { } 必须急切加载,而不是懒惰加载。您的问题并未说明如何在您的案例中加载ListingsModule