Ric*_*ahl 7 angular2-di angular
在Angular 1中,我经常使用工厂来提供服务,以存储许多组件可访问的共享状态.看起来在Angular 2中,每次都会创建注入@Injectable()的所有服务,从而失去共享状态.
我在根模块的providers元键上注册'服务,但我仍然得到一个瞬态实例.
是)我有的:
Injectable()
export class ArtistService {
constructor(private http:Http) {
// firing on each injection
console.log("ArtistService ctor");
}
}
Run Code Online (Sandbox Code Playgroud)
然后在组件中调用它:
@Component({
selector: 'artist-display',
templateUrl: './artistDisplay.html',
})
export class ArtistDisplay {
constructor(private artistService: ArtistService) {
// instance is fine but transient
}
}
Run Code Online (Sandbox Code Playgroud)
以及模块的定义:
@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]
})
Run Code Online (Sandbox Code Playgroud)
我怀疑可能有其他方式'注册',ArtistService所以它作为静态实例保持加载?可以通过DI实现,还是需要手动创建静态实例方法?
更新:
原来上面的代码确实有效.我正在寻找错误的地方以及导致数据无法正确缓存的逻辑错误.
上面的代码工作并providers在顶级AppModule部分中分配服务是在AppComponent的持续时间内使父引用保持加载的关键.在提供Singleton实例的应用程序的生命周期内有效地保持加载状态.
要获得瞬态实例,您可以在实际组件上声明providers元标记和服务名称,然后在加载/重新加载组件时创建服务.
你所展示的是正确的方法。它创建将在组件之间共享的单个实例。
https://plnkr.co/edit/FBCa39YC4ZPoy6y8OZQl?p=preview供参考。
import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { AppComponent } from './app.component';
import {service} from './service';
@NgModule({
imports: [ BrowserModule ],
declarations: [ AppComponent],
providers:[service],
bootstrap: [ AppComponent ]
})
export class AppModule { }
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
16998 次 |
| 最近记录: |