Javascript Angular 2、ngrx/store、RxJS和树状数据
我一直在试图找到一种方法,将select操作符与rxjs的其他操作符结合使用来查询树数据结构(在存储中标准化为平面列表)以这样的方式,它保留了ChangeDetectionStrategy.OnPush语义的引用完整性,但我的最佳尝试是在树的任何部分发生更改时,使整个树重新成为索引。有人有什么想法吗? 如果您认为以下接口是存储中数据的代表:Javascript Angular 2、ngrx/store、RxJS和树状数据,javascript,angular,rxjs,ngrx,Javascript,Angular,Rxjs,Ngrx,我一直在试图找到一种方法,将select操作符与rxjs的其他操作符结合使用来查询树数据结构(在存储中标准化为平面列表)以这样的方式,它保留了ChangeDetectionStrategy.OnPush语义的引用完整性,但我的最佳尝试是在树的任何部分发生更改时,使整个树重新成为索引。有人有什么想法吗? 如果您认为以下接口是存储中数据的代表: 导出接口树节点状态{ id:字符串; 文本:字符串; children:string[]//子节点的ID } 导出接口应用程序状态{ 节点:TreeNod
导出接口树节点状态{
id:字符串;
文本:字符串;
children:string[]//子节点的ID
}
导出接口应用程序状态{
节点:TreeNodeState[]
}
如果愿意重新思考问题,可以使用Rxjs操作符:
state$.scan((state, nodes) => nodes ? mutateNodesBy(nodes, state) : stateToNodes(state))
当节点只构建一次,然后只进行变异时,输出保证保持引用完整性(如果可能)。您是否有幸实现了这一点?我在我的应用程序中也有同样的要求。我们可以假设
ApplicationState.nodes
在父节点的子节点之前有父节点吗?同样,使用OnPush
更改仅在属性引用更改后传播(或者调用markForCheck()
,但会更新整个组件). 这意味着您必须更新对数组的引用,从而检查整个树。您可能希望使用Immutable.js,而不是OnPush,但我不确定这在angular上到底是如何工作的。如果您让每个节点都成为一个可观察的节点,每个父节点都是观察者呢?请提供一个演示?我不确定我是否完全理解你的想法。