【问题标题】:How to retrieve the latest state from an RxJS observable?如何从 RxJS 可观察对象中检索最新状态?
【发布时间】:2017-03-14 17:16:59
【问题描述】:

在这个ngrx example 中,searchQuery$ 是一个 RxJS Observable。我知道当 UI 上的搜索查询字符串发生变化时,Observable 会发出变化。

我已经向这个控件引入了另一个名为paging$Observable 来进行分页。这个Observable 发出页码。当页面发生变化时,我必须调用另一个服务器来检索剩余的书籍。

当我在用户单击页面时调用服务器时,我有页码,因为它直接来自 UI,而不是 searchQuery$ Observable 已经发出的搜索字符串。

如何结合 searchQuery$paging$ 使用 RxJS 检索搜索字符串和页码?

更新:

事件:

  1. 用户在搜索框中输入an
  2. 显示前 10 本书。
  3. 用户现在单击 NEXT 分页按钮。
  4. 应该显示接下来的 10 本书(在带有最后一个搜索字符串 an 的 http 请求之后)。

ngrx 示例中的代码:

import 'rxjs/add/operator/let';
import 'rxjs/add/operator/take';
import { Component, ChangeDetectionStrategy } from '@angular/core';
import { Store } from '@ngrx/store';
import { Observable } from 'rxjs/Observable';

import * as fromRoot from '../reducers';
import * as book from '../actions/book';
import { Book } from '../models/book';

@Component({
  selector: 'bc-find-book-page',
  changeDetection: ChangeDetectionStrategy.OnPush,
  template: '
    <bc-book-search [query]="searchQuery$ | async" [searching]="loading$ | async" (search)="search($event)"></bc-book-search>
    <bc-book-preview-list [books]="books$ | async"></bc-book-preview-list>
  '
})
export class FindBookPageComponent {
  searchQuery$: Observable<string>;
  books$: Observable<Book[]>;
  loading$: Observable<boolean>;

  constructor(private store: Store<fromRoot.State>) {
    this.searchQuery$ = store.select(fromRoot.getSearchQuery).take(1);
    this.books$ = store.select(fromRoot.getSearchResults);
    this.loading$ = store.select(fromRoot.getSearchLoading);
  }

  search(query: string) {
    this.store.dispatch(new book.SearchAction(query));
  }
}

【问题讨论】:

  • 反对票不是来自我,而是关于您的问题的提示:请直接在 stackoverflow 上包含代码,因为外部代码可能会随着时间的推移而改变,或者可能会脱机,或者链接可能会断开。跨度>

标签: rxjs observable ngrx angular2-observables


【解决方案1】:

你可以使用combineLatest:

updateBooks$ = Observable.combineLatest(
    this.searchQuery$,
    this.paging$
).do(([searchQuery, paging]: [string, number]) => {
    ...makeServerRequest or dispatch an action here
});

updateBooks$
    // when subscribing in a component directly, don't forget to handle component-destructions: http://stackoverflow.com/questions/42490265/rxjs-takeuntil-angular2-components-ngondestroy
    .takeUntil(destroyed$)
    .subscribe();

*如果您的代码与 ngrx-example 相同,则必须从 searchQuery$ 上的 store-select 中删除 take(1)

【讨论】:

  • 这是否意味着,任何 observable 都将保持其最新状态并且可以按上述方式检索?
  • 不是任何可观察的,但如果您的商店中有 select-statement,情况就是如此 - 另外:combineLatest 将保存给定可观察对象的最新状态并发出一个数组每当给定的 observable 之一发出数据时,所有最新状态。
  • 我不认为我理解您的问题 - 以防万一您在示例应用程序之上构建示例,您当然必须在商店选择之后删除 take(1) ,因为这只会触发一次来自商店的更新。
  • 每当用户在搜索输入中输入内容时,都会使用 searchQuery 更新商店 - 如果没有输入任何内容,那么它只是一个空字符串。
  • 是的,您测试我的解决方案了吗?它应该适用于这种情况
猜你喜欢
  • 1970-01-01
  • 2022-11-09
  • 2020-03-17
  • 1970-01-01
  • 2016-06-18
  • 1970-01-01
  • 2022-11-25
  • 2021-01-06
  • 1970-01-01
相关资源
最近更新 更多