首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Angular2从子模块导入和声明全局服务

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

Stack Overflow用户
提问于 2017-02-06 09:11:27
回答 3查看 2.3K关注 0票数 0

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

为此,我首先尝试将A声明为ListingsModule中的提供程序,但这不像预期的那样工作,因为它只是被声明为用于ListingsModule下的组件和服务的单例,但我还需要在其他模块和AppModule下使用它。因此,我得出的结论是,我需要从ListingsModule导出此服务,并在AppModule下导入和提供该服务,但这并不像预期的那样有效。

A是ListingsStoreService。

代码语言:javascript
复制
//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,那么它会给我另一个错误。显然我只能提供这项服务。

这里的正确方法是什么?我该怎么做呢?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-02-06 10:55:49

角对它的一些模块(例如RouterModule)所做的是允许通过称为"forRoot“和"forChild”的静态函数,按照约定创建相同模块的两个版本。"forRoot“可以包含一个全局服务,例如它的提供者数组中的"ListingsStoreService”,而"forChild“将省略它。然后,您可以在ListingsModule.forRoot imports数组中调用"ListingsModule.forChild()“,并在任何需要"ListingsModule”的地方调用“ListingsModule.forChild()”。

代码语言:javascript
复制
@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: []
        };
    };
};
票数 2
EN

Stack Overflow用户

发布于 2017-02-06 09:19:50

您的ListingsStoreService必须导入

代码语言:javascript
复制
imports: [
    SharedModule,
    HeaderModule,
    ListingsRoutingModule,
    ListingsStoreService
],

我觉得这是你的问题。你能试试这个吗?我已经写过评论了,但我需要50个名誉.因此,这里有一个答案,我不知道100%,如果它起作用。

票数 0
EN

Stack Overflow用户

发布于 2017-02-06 10:22:23

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

ListingsModule提供程序中声明服务

代码语言:javascript
复制
@NgModule({
  providers: [ ListingsStoreService ]
})
export class ListingsModule {
}

然后在ListingsModule中导入AppModule

代码语言:javascript
复制
@NgModule({
  imports: [ ListingsModule ]
})
export class AppModule {
}

注意:必须急切地加载ListingsModule,而不是延迟加载。您的问题并没有说明如何在您的情况下加载ListingsModule

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42063998

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档