2016-11-04 180 views
1

在我的应用程序中,我有一个包含两个组件的模块,ListComponent和DetailsComponent以及一个服务MyModuleService。Angular 2服务依赖注入问题

当用户访问ListComponet时,我从服务器获取列表并将其添加到服务的List属性(然后我将其用作缓存)。

当用户单击列表中的任何项目时,它将转到该项目的“详细信息”页面。

详细信息组件我使用Next和Previous链接导航,我使用服务的List属性来决定下一个和上一个项目。

如果用户返回到列表页面,则列表将从缓存中呈现,即从服务的List属性中呈现。

我的列表组件还有一个搜索表单,它允许用户指定搜索条件并从匹配该条件的服务器检索项目。

问题是,如果我导航到没有任何引用上面提到的MyModule,然后回到列表页面的任何其他路由,然后回到列表页面,它不刷新MyModuleService,这意味着它没有销毁Service实例。

可能是因为MyModuleService被添加到全局依赖注入上下文中。

任何人都可以请引导,我如何限制服务的范围只有一个模块?所以当我导航到另一条路线时,它会销毁MyModuleService实例。

+0

我很害怕在设计中不能将DI示波器限制为单个模块。你可以做的是读取从你到达ListComponent的路线的URL,并根据这个决定是否刷新。 – Picci

回答

2

很可能是因为MyModuleService被添加到全局依赖注入上下文中。

是和this is by design

限制的范围,以所述模块的方式是通过在模块中使用“顶部部件”(如在给定的文档链接所述),则providers阵列@Component装饰的中宣布服务:

@Component({ 
    selector: 'my-top-component', 
    providers: [ MyModuleService ] 
}) 
export class MyTopComponent { } 

这样,MyModuleService范围将被限制为MyTopComponent及其子女。但由于MyTopComponent内部有两个嵌套组件(ListComponentDetailsComponent),所以您也必须处理child routes

+0

谢谢罗德里戈,这是有帮助的:) –

+0

但它并没有真正从内存中删除服务...其他的想法? –

1

要向不同模块提供不同的服务实例,请使用providers数组。

Module1: 

providers: [MyService] 

Module2: 

providers: [MyService] 

现在这两个模块都使用相同的服务的不同实例。

如果需要,您可以在组件级别声明提供程序。这意味着该组件和任何子组件将具有该服务的单个实例的实例。

如果您希望整个应用只使用一次服务实例,然后将其提供给顶层模块的提供者数组。