Trong Góc 1 Tôi thường xuyên sử dụng các nhà máy cho các dịch vụ lưu trữ trạng thái chia sẻ có thể truy cập được bởi nhiều thành phần. Dường như trong Angular 2 tất cả các dịch vụ được tiêm dưới dạng @Injectable() được tạo ra mỗi lần, do đó làm mất trạng thái chia sẻ.Góc 2 - Dịch vụ Singleton?
Tôi 'đăng ký' dịch vụ tại khóa meta của mô-đun gốc providers
, nhưng tôi vẫn nhận được phiên bản tạm thời.
Những gì tôi có:
Injectable()
export class ArtistService {
constructor(private http:Http) {
// firing on each injection
console.log("ArtistService ctor");
}
}
gọi nó trong một thành phần thì:
@Component({
selector: 'artist-display',
templateUrl: './artistDisplay.html',
})
export class ArtistDisplay {
constructor(private artistService: ArtistService) {
// instance is fine but transient
}
}
Và định nghĩa của mô-đun:
@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]
})
Tôi nghi ngờ có thể một số là cách khác để 'đăng ký' ArtistService
để nó vẫn được nạp như một thể hiện tĩnh? Có thể thông qua DI hoặc là cần thiết để tạo ra một phương pháp dụ tĩnh bằng tay?
Cập nhật:
Hóa ra rằng mã trên không làm việc. Tôi đã tìm kiếm sai địa điểm cùng với lỗi logic khiến dữ liệu không được lưu vào bộ nhớ cache chính xác.
Mã trên hoạt động và chỉ định dịch vụ trong phần providers
của cấp cao nhất AppModule là chìa khóa để làm cho tham chiếu gốc được tải trong suốt thời hạn của AppComponent. có hiệu quả trong thời gian tải của ứng dụng cung cấp ví dụ Singleton.
Để có được một trường hợp thoáng bạn có thể khai báo thẻ meta providers
và tên dịch vụ trên thành phần thực tế mà sau đó sẽ tạo ra các dịch vụ bất cứ khi nào các thành phần được nạp/tái nạp.
Hmmm ... nó không hoạt động đối với tôi. Nhà xây dựng dịch vụ kích hoạt trên mỗi lần tiêm vào 'ArtistDisplayComponent'. –
xem tôi đã thêm liên kết hoạt động hiển thị dịch vụ được chia sẻ. – micronyks
Ok tôi kiểm tra lại và nó thực sự hoạt động. Lỗi nhà điều hành trên một phần của tôi - Tôi đã nhìn nhầm console.log() :-) –