我有一些数据想要与我的整个应用程序共享,所以我创建了一个这样的服务。
用户.服务
userDataSource = BehaviorSubject<Array<any>>([]);
userData = this.userDataSource.asObservable();
updateUserData(data) {
this.userDataSource.next(data);
}
然后在我的组件中,我从 api 获取一些数据,然后将该数据发送到userDataSource
,如下所示。
constructor(
private: userService: UserService,
private: api: Api
){
}
ngOnInit() {
this.api.getData()
.subscribe((data) => {
this.userService.updateUserData(data);
})
}
现在一切都有效,但是..我希望能够在userDataSource
内数组的末尾添加数据,所以基本上相当于一个.push
我是否可以调用updateUserData()
函数并添加更多数据,或者这样做会覆盖当前的内容那里?
任何帮助将不胜感激
您可以向服务添加新方法,例如addData
可以将以前的数据与新数据(如)组合在一起。
import {Injectable} from '@angular/core';
import {BehaviorSubject} from 'rxjs/BehaviorSubject';
@Injectable()
export class UserService {
userDataSource: BehaviorSubject<Array<any>> = new BehaviorSubject([]);
userData = this.userDataSource.asObservable();
updateUserData(data) {
this.userDataSource.next(data);
}
addData(dataObj) {
const currentValue = this.userDataSource.value;
const updatedValue = [...currentValue, dataObj];
this.userDataSource.next(updatedValue);
}
}
对于可能遇到此问题的人BehaviorSubject<YourObject[]>
.
我在本文中找到了一种正确添加新YourObject
数组的方法
import { Observable, BehaviorSubject } from 'rxjs';
import { YourObject} from './location';
import { Injectable } from '@angular/core';
@Injectable({
providedIn: 'root'
})
export class ObjService {
private theObjData: BehaviorSubject<YourObject[]> = new BehaviorSubject<YourObject[]>(null);
constructor() {
}
public SetObjData(newValue: YourObject[]): void {
this.theObjData.next(Object.assign([], newValue));
}
}
如何更新数据:
// inside some component
this.api.userData().subscribe((results:YourObject) =>
this.objService.SetObjData(results);
)
如何观察其他组件的变化
// inside another component
ngOnInit() {
this.objService.GetAccountStatements().subscribe((results) =>
...
)
}
通常,Observables
和Subject
是数据流,而不是数据赋值。BehaviorSubject
是不同的,因为它们保存其最后发出的值。
通常,包含类(如服务)中的Subject
或BehaviorSubjects
不希望向任何其他类公开自己,因此最佳做法是使用get
ter 或方法访问其属性。这使数据流对所有订阅者保持冷淡。
但是,由于BehaviorSubject
保存最后一个发出的值,因此这里有几个选项。如果所有订阅者都需要来自每个发射的串联数据流,您可以访问最后一个发出的值并附加到它:
userDataSource = BehaviorSubject<any[]>([]);
userData = this.userDataSource.asObservable();
updateUserData(data) {
this.userDataSource.next(this.userDataSource.value.push(data));
}
。或者,在可能被认为是更好的做法中,此主题的订阅者可以在流上进行自己的转换:
this.api.userData()
.scan((prev, current) => prev.push(current). [])
.subscribe((data) => {
this.concatenatedUserData = data;
});
使用 concat 添加对象
userDataSource = BehaviorSubject<Array<any>>([]);
updateUserData(data) {
this.userDataSource.next(this.userDataSource.value.concat(data));
}
使用过滤器删除对象
removeUserData(data) {
this.userDataSource.next(this.userDataSource.value.filter(obj => obj !== data));
}