这是我结束了:
1)添加了独特name
路由定义的data
export const ROUTES: Routes = [
{
path: '/articles',
component: ArticlesListPage,
data: {
name: 'articles-list'
}
}
];
2)创建一个自定义serializer为router-store
只提取params
,queryParams
和name
(从data.name
)树中的每个孩子
function createSerializedTree(node: ActivatedRouteSnapshot) {
const tree = {
queryParams: node.queryParams,
params: node.params,
name: node.data.name,
children: node.children.map(createSerializedTree),
firstChild: undefined
};
tree.firstChild = tree.children[0];
return tree;
}
3)创建一个函数f该过滤器和地图与名称的第一个路径匹配一个你提供
const _checkIsNodeHasName = (name: string, node: SerializedRouterNode) => {
if (node.name === name) {
return node;
} else if (node.firstChild) {
return _checkIsNodeHasName(name, node.firstChild);
} else {
return undefined;
}
}
export const filterAndMapRoute = (name: string) => {
return (navigationAction$: Observable<RouterNavigationAction<RouterStateUrl>>) => {
return navigationAction$
.map(action => action.payload.routerState)
.filter((state) => !!_checkIsNodeHasName(name, state.root))
.map((state) => _checkIsNodeHasName(name, state.root));
};
};
或let
现在我能做到这一点
@Injectable()
export class ArticlesEffects {
@Effect()
private _onRouteChange$ = this._action$
.ofType(ROUTER_NAVIGATION)
.let(filterAndMapRoute('posts-list'))
.map(/* ... */) // map to whatever action I need
}
这或多或少只是一个概念证明,现实我会不仅需要检查firstChild,还要检查所有的孩子。
我先用简单的树的最后firstChild
去了,但有些情况下,如果你想救id
从这些途径
/articles/:id/graph
//articles/:id/table
,最后firstChild
那就没办法了,例如情况下,将不包含id
,因此需要找到与名称匹配的第一个孩子并映射到该孩子(如果没有找到,则进行筛选)。