ngrx - 链两个store.select切片

时间:2017-11-13 16:13:34

标签: angular rxjs ngrx

在我的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单个属性切片感兴趣。

谢谢!

3 个答案:

答案 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每次 getTodosgetLastChangedTodo中的任何一个时都会执行,并会在当时获取每个<{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)
})