在 Angular 1 中,我经常使用工厂来创建服务以存储被许多组件访问的共享状态。看起来在 Angular 2 中,所有被注入为 @Injectable() 的服务都会每次都被创建,从而导致共享状态丢失。
我将服务注册到根模块的 providers 元数据关键字中,但仍然获得了一次性实例。
我的情况是:
我怀疑可能有其他方法来“注册”
更新: 事实证明上述代码确实可行。我在错误的位置查找,并且逻辑错误导致数据无法正确缓存。
上述代码有效,并将服务分配到顶层AppModule的
要获取瞬态实例,您可以在实际组件上声明
我将服务注册到根模块的 providers 元数据关键字中,但仍然获得了一次性实例。
我的情况是:
Injectable()
export class ArtistService {
constructor(private http:Http) {
// firing on each injection
console.log("ArtistService ctor");
}
}
在组件中调用它:
@Component({
selector: 'artist-display',
templateUrl: './artistDisplay.html',
})
export class ArtistDisplay {
constructor(private artistService: ArtistService) {
// instance is fine but transient
}
}
这里是关于模块的定义:
@NgModule({
declarations: [...],
imports: [BrowserModule, FormsModule, HttpModule,
RouterModule.forRoot(rootRouterConfig)],
providers : [
ArtistService,
// make sure you use this for Hash Urls rather than HTML 5 routing
{ provide: LocationStrategy, useClass: HashLocationStrategy },
],
bootstrap: [AppComponent]
})
我怀疑可能有其他方法来“注册”
ArtistService
,使其作为静态实例保持加载?这是否可以通过DI实现,还是必须手动创建静态实例方法?更新: 事实证明上述代码确实可行。我在错误的位置查找,并且逻辑错误导致数据无法正确缓存。
上述代码有效,并将服务分配到顶层AppModule的
providers
部分是使父引用在AppComponent的生命周期内保持加载的关键。这有效地保持应用程序的生命周期提供了Singleton实例。要获取瞬态实例,您可以在实际组件上声明
providers
元标记和服务名称,这样每当组件加载/重新加载时就会创建服务。