ngrx:如何组合可观察对象以在异步管道中使用
ngrx: how to combine observables for use in async pipe
我正在尝试使用 observables 和 ngrx 获取未决更改的影子副本,但我 运行 遇到了一个我不明白的小问题:
export class SearchBoxContainerComponent {
filterSettings$: Observable<FilterSettings>;
filterChanges: {[key:string]: any};
filterChanges$: Subject<{[key:string]: any}>;
constructor(private store: Store<fromRoot.State>) {
this.filterChanges = {};
this.filterChanges$ = new Subject();
this.filterSettings$ = Observable.combineLatest(
store.let(fromRoot.getFilterSettings),
this.filterChanges$,
(filterSettings, filterChanges) => {
return Object.assign({}, filterSettings, filterChanges);
}
);
this.filterChanges$.subscribe(foo => {
console.log('filterChanges$: ', foo);
});
this.filterSettings$.subscribe(foo => {
console.log('filterSettings$: ', foo);
});
this.filterChanges$.next(this.filterChanges);
}
updateSetting(key, value) {
this.filterChanges = Object.assign({}, this.filterChanges, {[key]: value});
this.filterChanges$.next(this.filterChanges);
}
submitSearchbox() {
// TODO send ngrx action to really update the filterSettings
}
}
这里我用的是Observable.combineLatest而不是直接用
this.filterSettings$ = store.let(fromRoot.getFilterSettings);
从 ngrx 存储中获取一个 observable。
我遇到的问题是,当我的搜索框打开时,一开始一切都是空的。只有在更新值之后,所有内容才会被填充。如果我直接用 store.let 绑定它,它就可以工作。
我在 HTML 中像这样使用异步管道
<my-component [filterSettings]="filterSettings$ | async"></my-component>
但它在 *ngIf 中,因此只有在搜索框打开后才会进行评估。
我猜异步管道在所有操作发生后订阅并且没有新事件它没有获得值。但是为什么它与 store.let 一起工作呢?是不是总有一个不同的可观察值给你一个值?
问题是我做错了什么,我觉得我仍然遗漏了一些东西...额外的问题:这是一个可以中止或提交数据卷影副本的好方法吗?
使用 rxjs/BehaviorSubject
而不是普通的 rxjs/Subject
。它将把收到的最后一个项目提供给新订阅者。
this.filterChanges = {};
this.filterChanges$ = new BehaviorSubject(this.filterChanges);
你不需要 next()
之后,因为它在构造函数上有一个值。 Observable.combineLatest()
届时应该会按预期工作。
我正在尝试使用 observables 和 ngrx 获取未决更改的影子副本,但我 运行 遇到了一个我不明白的小问题:
export class SearchBoxContainerComponent {
filterSettings$: Observable<FilterSettings>;
filterChanges: {[key:string]: any};
filterChanges$: Subject<{[key:string]: any}>;
constructor(private store: Store<fromRoot.State>) {
this.filterChanges = {};
this.filterChanges$ = new Subject();
this.filterSettings$ = Observable.combineLatest(
store.let(fromRoot.getFilterSettings),
this.filterChanges$,
(filterSettings, filterChanges) => {
return Object.assign({}, filterSettings, filterChanges);
}
);
this.filterChanges$.subscribe(foo => {
console.log('filterChanges$: ', foo);
});
this.filterSettings$.subscribe(foo => {
console.log('filterSettings$: ', foo);
});
this.filterChanges$.next(this.filterChanges);
}
updateSetting(key, value) {
this.filterChanges = Object.assign({}, this.filterChanges, {[key]: value});
this.filterChanges$.next(this.filterChanges);
}
submitSearchbox() {
// TODO send ngrx action to really update the filterSettings
}
}
这里我用的是Observable.combineLatest而不是直接用
this.filterSettings$ = store.let(fromRoot.getFilterSettings);
从 ngrx 存储中获取一个 observable。
我遇到的问题是,当我的搜索框打开时,一开始一切都是空的。只有在更新值之后,所有内容才会被填充。如果我直接用 store.let 绑定它,它就可以工作。
我在 HTML 中像这样使用异步管道
<my-component [filterSettings]="filterSettings$ | async"></my-component>
但它在 *ngIf 中,因此只有在搜索框打开后才会进行评估。 我猜异步管道在所有操作发生后订阅并且没有新事件它没有获得值。但是为什么它与 store.let 一起工作呢?是不是总有一个不同的可观察值给你一个值?
问题是我做错了什么,我觉得我仍然遗漏了一些东西...额外的问题:这是一个可以中止或提交数据卷影副本的好方法吗?
使用 rxjs/BehaviorSubject
而不是普通的 rxjs/Subject
。它将把收到的最后一个项目提供给新订阅者。
this.filterChanges = {};
this.filterChanges$ = new BehaviorSubject(this.filterChanges);
你不需要 next()
之后,因为它在构造函数上有一个值。 Observable.combineLatest()
届时应该会按预期工作。