Angular2 Observable BehaviorSubject 服务不工作
Angular2 Observable BehaviorSubject service not working
我正在尝试创建自己的可观察服务,但在我从该服务获取初始数据后,对该服务的任何更新都不会传播给任何订阅者。服务如下所示:
import { Injectable } from '@angular/core';
import { Observable, BehaviorSubject } from 'rxjs/Rx';
@Injectable()
export class DataService {
keys : number[] = [4,5,1,3,2];
private data :BehaviorSubject<number[]> = new BehaviorSubject(this.keys);
constructor() {};
public setKey(i:number, val:number) :void {
this.keys[i]=val;
this.data.next(this.keys);
}
public getData() :Observable<number[]> {
return new Observable(fn => this.data.subscribe(fn));
}
public getKeys() :number[] {
return this.keys;
}
}
使用该服务的组件可以很好地获取初始数据。该组件在构造函数中获取其数据:
constructor(public dataService: DataService) {
dataService.getData().subscribe(data => {
console.log("Gotcha!");
this.data.datasets[0].data = data)
});
};
这在控制台日志中给出了一个常见问题。但是在其他地方用 setKey(2,3) 更新数据后,我期待
this.data.next(this.keys);
向所有订阅者发送数据,数据将在该组件内相应地更新。但是没有数据发送给订阅者..
我以为我想出了 Observables,但如果我错过了这里的要点,请不要友好 ;) 任何正确方向的指示将不胜感激!
每次发出一个值时,您都应该创建一个新对象,而不是发出相同的变异对象。这将保护您免受更改检测问题的影响。不过,最好在更改对象时始终将新对象分配给 this.keys
。
this.data.next([...this.keys]);
你可以在这里使用asObservable()
public getData(): Observable<number[]> {
return this.data.asObservable();
}
同时查看 Günter Zöchbauer 所说的内容。您是否以单身人士的身份提供服务?
我曾遇到过同样的问题。原因很可能是您的服务不是单例,即每个订阅者都获得一个新实例。与 Angular 1 相反,在 A2 中服务不是单例。
如果您想让多个 services/components 共享该服务的一个实例,请将它放在您父 @Component
或 @NgModule
.[=14 的 providers
中=]
@NgModule({
declarations: [],
imports: [],
bootstrap: [AppComponent],
providers: [DataService]
})
export class AppModule {
}
我正在尝试创建自己的可观察服务,但在我从该服务获取初始数据后,对该服务的任何更新都不会传播给任何订阅者。服务如下所示:
import { Injectable } from '@angular/core';
import { Observable, BehaviorSubject } from 'rxjs/Rx';
@Injectable()
export class DataService {
keys : number[] = [4,5,1,3,2];
private data :BehaviorSubject<number[]> = new BehaviorSubject(this.keys);
constructor() {};
public setKey(i:number, val:number) :void {
this.keys[i]=val;
this.data.next(this.keys);
}
public getData() :Observable<number[]> {
return new Observable(fn => this.data.subscribe(fn));
}
public getKeys() :number[] {
return this.keys;
}
}
使用该服务的组件可以很好地获取初始数据。该组件在构造函数中获取其数据:
constructor(public dataService: DataService) {
dataService.getData().subscribe(data => {
console.log("Gotcha!");
this.data.datasets[0].data = data)
});
};
这在控制台日志中给出了一个常见问题。但是在其他地方用 setKey(2,3) 更新数据后,我期待 this.data.next(this.keys); 向所有订阅者发送数据,数据将在该组件内相应地更新。但是没有数据发送给订阅者..
我以为我想出了 Observables,但如果我错过了这里的要点,请不要友好 ;) 任何正确方向的指示将不胜感激!
每次发出一个值时,您都应该创建一个新对象,而不是发出相同的变异对象。这将保护您免受更改检测问题的影响。不过,最好在更改对象时始终将新对象分配给 this.keys
。
this.data.next([...this.keys]);
你可以在这里使用asObservable()
public getData(): Observable<number[]> {
return this.data.asObservable();
}
同时查看 Günter Zöchbauer 所说的内容。您是否以单身人士的身份提供服务?
我曾遇到过同样的问题。原因很可能是您的服务不是单例,即每个订阅者都获得一个新实例。与 Angular 1 相反,在 A2 中服务不是单例。
如果您想让多个 services/components 共享该服务的一个实例,请将它放在您父 @Component
或 @NgModule
.[=14 的 providers
中=]
@NgModule({
declarations: [],
imports: [],
bootstrap: [AppComponent],
providers: [DataService]
})
export class AppModule {
}