【问题标题】:RxJS Observable replace stream with new dataRxJS Observable 用新数据替换流
【发布时间】:2017-11-07 07:21:05
【问题描述】:

我有一个服务,它会在初始化时更新 observable 的数据,然后在 http 搜索时更新。

使用 next() 将记录添加到 observable 中的数组中,但是我将如何用新集合替换这些记录?

search.service.ts

 private searchSource = new BehaviorSubject<any>(this.getInitialCollections());

    public currentState = this.searchSource.asObservable();

    public getInitialCollections() {
        return this.apiService.post(this.searchApi)
            .subscribe(data => this.changeSubject(data));
    }

    public search(phrase: string) {
        return this.apiService.post(this.searchApi, { phrase: phrase })
            .subscribe(data => this.changeSubject(data));
    }

    private changeSubject(results: object) {
        this.readCollectionResult(results).map(data => this.searchSource.next(data));
    }

    private readCollectionResult(result: any): Asset[] {
        return (result && result.data) ? result.data.map(asset => asset) : [];
    }

组件.ts

export class SearchDataSet {
    /** Stream that emits whenever the data has been modified. */
    dataChange: BehaviorSubject<Asset[]> = new BehaviorSubject<Asset[]>([]);
    get data(): Asset[] { return this.dataChange.value; }

    constructor(
        private _searchService: SearchService
    ) {
        this.initialize();
    }

    records = this.data.slice();

    initialize() {
        this._searchService.currentState
            .subscribe(item => !item.id ? null : this.addRecord(item));
    }

    /** Adds a new asset to the database. */
    addRecord(item: object) {
        this.records.push(item);
        this.dataChange.next(this.records);
    }
}

【问题讨论】:

    标签: rxjs


    【解决方案1】:

    '使用 next() 将记录添加到 observable 中的数组'

    实际上,由于 searchSource 是一个 BehaviorSubject,它只能保存一个值,所以 searchSource.next(data) 将 searchSource 的当前内容替换为数据。

    您可能需要其他方法

    private addToSubject(results: object) {
      this.searchSource.subscribe(current => {
        const assets = this.readCollectionResult(results);
        this.searchSource.next(current.concat(assets));
      });
    }
    

    【讨论】:

    • 我看到项目的行为被添加到从 observable 返回的结果数组中 - 当我调用我的搜索函数时,结果只是那些附加到 currentState observable 末尾的项目
    • 对不起,我有一个关于 readCollectionResult 的注释然后意识到你已经发布了它,所以改变了答案。
    • 你真的可以像这样在下一个函数中执行 current.push(assets) 吗?我试试这个
    • 我看看能不能做个测试。您确定 searchSource 的当前值正在被修改,您不只是看到下一个发出的值吗?
    • 是的,这很奇怪,我会发布我正在使用该服务的组件
    猜你喜欢
    • 1970-01-01
    • 2020-09-01
    • 2017-07-30
    • 2019-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-10
    • 2020-12-01
    相关资源
    最近更新 更多