我正在尝试创建自己的可观察服务,但在从服务获取初始数据后,对服务的任何更新都不会传播给任何订阅者。服务看起来像这样:
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)
});
};
在控制台日志中给出一个Gotcha。但是在用其他地方的setKey(2,3)更新数据后,我期待着 this.data.next(this.keys); 向所有订户发送数据,并相应地在该组件内更新数据。但没有数据发送给订阅者..
我以为我想出了Observables,但如果我在这里错过了点,请不要友好;)任何正确方向的指针将不胜感激!
答案 0 :(得分:35)
我在某些方面遇到了同样的问题。这可能是因为您的服务不是单一服务,即每个订户都获得一个新实例。与Angular 1相反,A2服务不是单身人士。
如果您想让多个服务/组件共享一个服务实例,请将其放在父providers
或@Component
的{{1}}中。
@NgModule
答案 1 :(得分:9)
每次发出值时,都应该创建一个新对象,而不是发出相同的变异对象。这将保护您免受更改检测问题的影响。最好在更改时将总是分配给this.keys
。
this.data.next([...this.keys]);
您可以在此使用asObservable()
public getData(): Observable<number[]> {
return this.data.asObservable();
}
同时检查GünterZöchbauer所说的内容。您是以单身人士的身份提供服务吗?