在我的Todo Cmp中,我有这段代码
this.todoListGroup$ = this.ngrx.select(fromRoot.getTodos)
.flatMap((todos: Todo[]) => {
console.log(todos)
this.todos = todos
this.ngrx.select(fromRoot.getLastChangedTodo);
})
.map(lastTodo =>{{
console.log(lastTodo)
doSomething(this.todos, lastTodo)
})
当我订阅它时,每次todo更改时我都会再获得一个console.log(lastTodo)。我认为使用flatmap和ngrx.select,我每次订阅一个新的Observable?
我可以将哪个运营商链接两个商店切片?
编辑:
只要视图在DOM中,我希望保持订阅todoListGroup $,因为它应该不断更新我的视图。
到目前为止,我的解决方案是在reducer中定义一个新切片,它返回两个所需的属性。但是,我仍然对哪个运算符可以有效链接ngrx单个属性切片感兴趣。
谢谢!
答案 0 :(得分:13)
这是使用combineLatest运算符的RxJs v6 +的一种方法。
首先导入运算符和Observable
函数,如下所示:
import { Observable, combineLatest } from 'rxjs';
import { tap } from 'rxjs/operators';
然后您可以像这样使用它们:
combineLatest(
this.store.pipe(select('users', 'userList')),
this.store.pipe(select('users', 'accountsList')),
).pipe(tap(([userList, accountsList]) => console.log(userList, accountsList)))
答案 1 :(得分:7)
这样的事情会起作用吗?
this.todoListGroup$ =
Observable.combineLatest(
this.ngrx.select(fromRoot.getTodos),
this.ngrx.select(fromRoot.getLastChangedTodo)
)
.do(([todos, lastToDo]) => console.log(todos, lastToDo));
do
每次 getTodos
或getLastChangedTodo
中的任何一个时都会执行,并会在当时获取每个<{1}}的最新已知值更新。这里需要注意的是,当触发每个更新时,顺序可能并不总是相同。因此,如果您想要更多链接(或级联)更新,那么您可以这样做:
this.todoListGroup$ =
this.ngrx.select(fromRoot.getTodos)
.withLatestFrom(this.ngrx.select(fromRoot.getLastChangedTodo))
.do(([todos, lastToDo]) => console.log(todos, lastToDo));
每次getToDos
更新时都会执行,并会从getLastChangedTodo
获取最新值。因此链接(或级联)更新的习语。
答案 2 :(得分:0)
试试这个:
this.todoListGroup$ = this.ngrx.select(fromRoot.getTodos)
.flatMap((todos: Todo[]) => {
console.log(todos)
this.todos = todos
this.ngrx.select(fromRoot.getLastChangedTodo);
})
.take(1)
.map(lastTodo =>{{
console.log(lastTodo)
doSomething(this.todos, lastTodo)
})