AFAIK,要删除成角度的查询参数,我们需要执行以下操作:
defmodule TestModule do
def build_tree(levels, parent_id \\ nil) do
levels
|> Enum.filter(& &1.parent_id == parent_id) # get children of parent_id
|> Enum.map(fn level ->
%{level | children: build_tree(levels, level.id)} # recursively build subtrees of current level
end)
# we should now have child nodes of parent_id with their children populated
end
end
# sample input
levels = [
%{id: 1, parent_id: nil, children: []},
%{id: 2, parent_id: 1, children: []},
%{id: 3, parent_id: 2, children: []},
%{id: 4, parent_id: 2, children: []},
%{id: 5, parent_id: 4, children: []},
%{id: 6, parent_id: 1, children: []},
%{id: 7, parent_id: 6, children: []},
%{id: 8, parent_id: 6, children: []},
%{id: 9, parent_id: nil, children: []},
%{id: 10, parent_id: 9, children: []},
]
TestModule.build_tree(levels)
但是,当尝试添加路由保护器,解析器或正在添加到路由模块的任何东西时,该方法不起作用,因为这会先路由到当前路由,再路由到目标。
我之所以不尝试通过订阅router.events或在路由组件的ngOnInit上添加此逻辑,是因为首先,通过在router.events上进行订阅,所有路由更改都将得到因此很难在启动目标组件时仅“仅”删除查询参数,其次,在ngOnInit上应用逻辑将可以正常工作,但是这里的问题是很难重用代码,因为该代码仅删除特定的查询参数/ s。
这就是为什么我试图创建一个保护器/解析器,该保护器/分解器可以在多个路径上重用,并且只能在组件启动之前/之内完成。
谢谢!