ngrx - 链两个store.select切片

Han*_*Che 6 rxjs ngrx angular

在我的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)
    })
Run Code Online (Sandbox Code Playgroud)

当我订阅它时,每次todo更改时我都会再获得一个console.log(lastTodo).我认为使用flatmap和ngrx.select,我每次订阅一个新的Observable?

哪个运营商可以链接两个商店切片?

编辑:

只要视图在DOM中,我想继续订阅todoListGroup $,因为它应该不断更新我的视图.

到目前为止,我的解决方案是在reducer中定义一个新切片,它返回两个所需的属性.但是,我仍然对哪个运算符可以有效链接ngrx单个属性切片感兴趣.

谢谢!

Seb*_*dez 18

这是RxJ版本6.0的方法.

首先导入运算符和Observable函数,如下所示:

import { Observable, combineLatest } from 'rxjs';
import { tap } from 'rxjs/operators';
Run Code Online (Sandbox Code Playgroud)

然后你可以像这样使用它们:

combineLatest(
  this.store.pipe(select('users', 'userList')),
  this.store.pipe(select('users', 'accountsList')),
).pipe(tap(([userList, accountsList]) => console.log(userList, accountsList)))
Run Code Online (Sandbox Code Playgroud)

  • 现在,CombineLatest应该是商店选择的数组。 (2认同)

bry*_*n60 11

会这样的工作:

this.todoListGroup$ =
    Observable.combineLatest(
        this.ngrx.select(fromRoot.getTodos), 
        this.ngrx.select(fromRoot.getLastChangedTodo)
    )
    .do(([todos, lastToDo]) => console.log(todos, lastToDo));
Run Code Online (Sandbox Code Playgroud)

该do会执行每一次一方的getTodos或getLastChangedTodo更新,并会采取从他们每个人的最新已知值在更新的时间.这里需要注意的是,每次更新时的顺序可能并不总是相同.因此,如果您想要更多链接(或级联)更新,那么您可以这样做:

this.todoListGroup$ =
    this.ngrx.select(fromRoot.getTodos)
    .withLatestFrom(this.ngrx.select(fromRoot.getLastChangedTodo))
    .do(([todos, lastToDo]) => console.log(todos, lastToDo));
Run Code Online (Sandbox Code Playgroud)

这将在每次getToDos更新时执行,并将从中获取最新值getLastChangedTodo.因此链接(或级联)更新的习语.