在 Angular 1 中,我经常使用工厂服务来存储许多组件可以访问的共享状态。看起来在 Angular 2 中,所有作为 @Injectable() 注入的服务每次都被创建,因此失去了共享状态。
我在根模块的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 实现还是需要手动创建静态实例方法?
更新:
原来上面的代码确实有效。我在错误的地方寻找导致数据无法正确缓存的逻辑错误。
上面的代码有效,并且在顶级 AppModuleproviders
的部分中分配服务是使父引用在 AppComponent 的持续时间内保持加载的关键。在提供Singleton实例的应用程序的生命周期内有效地保持加载状态。
要获取瞬态实例,您可以在实际组件上providers
声明元标记和服务名称,然后在加载/重新加载组件时创建服务。