ngrx - chain two store.select slices

后端 未结 3 1623
逝去的感伤
逝去的感伤 2021-02-13 21:00

In my Todo Cmp I have this code

this.todoListGroup$ = this.ngrx.select(fromRoot.getTodos)
    .flatMap((todos: Todo[]) => {
        console.log(todos)
                


        
相关标签:
3条回答
  • 2021-02-13 21:33

    This is an approach for RxJs v6+ using the combineLatest operator.

    First import the operators and Observable function like this:

    import { Observable, combineLatest } from 'rxjs';
    import { tap } from 'rxjs/operators';
    

    Then you can use them like this:

    combineLatest([
      this.store.pipe(select('users', 'userList')),
      this.store.pipe(select('users', 'accountsList')),
    ]).pipe(tap(([userList, accountsList]) => console.log(userList, accountsList)))
    
    0 讨论(0)
  • 2021-02-13 21:42

    Try this:

    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)
    })
    
    0 讨论(0)
  • 2021-02-13 21:50

    Would something like this work:

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

    The do would execute each time either one of getTodos or getLastChangedTodo is updated and would take the latest known values from each of them at the time of the update. The caveat here is the order of when each of those updates are fired may not always be the same. So, if you wanted more of a chained (or cascaded) update then you could do this:

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

    That will execute each time getToDos is updated and would take the latest value from getLastChangedTodo. Hence the chained (or cascaded) updated idiom.

    edit for rxjs 5+ syntax:

    this.todoListGroup$ =
        combineLatest(
            this.ngrx.select(fromRoot.getTodos), 
            this.ngrx.select(fromRoot.getLastChangedTodo)
        )
        .pipe(tap(([todos, lastToDo]) => console.log(todos, lastToDo)));
    
    
    this.todoListGroup$ =
        this.ngrx.select(fromRoot.getTodos).pipe(
          withLatestFrom(this.ngrx.select(fromRoot.getLastChangedTodo)),
          tap(([todos, lastToDo]) => console.log(todos, lastToDo))
        );
    
    0 讨论(0)
提交回复
热议问题