Angular 2, ngrx/store, RxJS and tree-like data Angular 2, ngrx/store, RxJS and tree-like data angular angular

Angular 2, ngrx/store, RxJS and tree-like data


If willing to rethink the problem, you could use Rxjs operator scan:

  1. If no previous ApplicationState exists, accept the first one. Translate it to TreeNodes recursively. As this is an actual object, rxjs isn't involved.
  2. Whenever a new application state is received, ie when scan fires, implement a function that mutates the previous nodes using the state received, and returns the previous nodes in the scan operator. This will guarantee you referential integrity.
  3. You might now be left with a new problem, as changes to mutated tree nodes might not be picked up. If so, either look into track by by making a signature for each node, or consider adding a changeDetectorRef to a node (provided by component rendering node), allowing you to mark a component for update. This will likely perform better, as you can go with change detection strategy OnPush.

Pseudocode:

state$.scan((state, nodes) => nodes ? mutateNodesBy(nodes, state) : stateToNodes(state))

The output is guaranteed to preserve referential integrity (where possible) as nodes are built once, then only mutated.