Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/410.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Angular 2、ngrx/store、RxJS和树状数据_Javascript_Angular_Rxjs_Ngrx - Fatal编程技术网

Javascript Angular 2、ngrx/store、RxJS和树状数据

Javascript Angular 2、ngrx/store、RxJS和树状数据,javascript,angular,rxjs,ngrx,Javascript,Angular,Rxjs,Ngrx,我一直在试图找到一种方法,将select操作符与rxjs的其他操作符结合使用来查询树数据结构(在存储中标准化为平面列表)以这样的方式,它保留了ChangeDetectionStrategy.OnPush语义的引用完整性,但我的最佳尝试是在树的任何部分发生更改时,使整个树重新成为索引。有人有什么想法吗? 如果您认为以下接口是存储中数据的代表: 导出接口树节点状态{ id:字符串; 文本:字符串; children:string[]//子节点的ID } 导出接口应用程序状态{ 节点:TreeNod

我一直在试图找到一种方法,将select操作符与rxjs的其他操作符结合使用来查询树数据结构(在存储中标准化为平面列表)以这样的方式,它保留了ChangeDetectionStrategy.OnPush语义的引用完整性,但我的最佳尝试是在树的任何部分发生更改时,使整个树重新成为索引。有人有什么想法吗? 如果您认为以下接口是存储中数据的代表:

导出接口树节点状态{
id:字符串;
文本:字符串;
children:string[]//子节点的ID
}
导出接口应用程序状态{
节点:TreeNodeState[]

}
如果愿意重新思考问题,可以使用Rxjs操作符:

  • 如果以前的应用程序状态不存在,请接受第一个。递归地将其转换为树节点。因为这是一个实际的对象,所以不涉及rxjs
  • 每当接收到新的应用程序状态时,即扫描触发时,执行一个函数,使用接收到的状态改变以前的节点,并在扫描操作符中返回以前的节点。这将保证引用完整性
  • 现在,您可能会遇到一个新问题,因为对变异树节点所做的更改可能无法获取。如果是这样,要么通过为每个节点签名,要么考虑向节点添加一个节点(由组件呈现节点提供),允许您标记一个组件进行更新。这可能会表现得更好,你可以这样做
  • 伪代码:

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

    当节点只构建一次,然后只进行变异时,输出保证保持引用完整性(如果可能)。

    您是否有幸实现了这一点?我在我的应用程序中也有同样的要求。我们可以假设
    ApplicationState.nodes
    在父节点的子节点之前有父节点吗?同样,使用
    OnPush
    更改仅在属性引用更改后传播(或者调用
    markForCheck()
    ,但会更新整个组件). 这意味着您必须更新对数组的引用,从而检查整个树。您可能希望使用Immutable.js,而不是OnPush,但我不确定这在angular上到底是如何工作的。如果您让每个节点都成为一个可观察的节点,每个父节点都是观察者呢?请提供一个演示?我不确定我是否完全理解你的想法。