我有一组 Angular 路由,其中包含实体列表,以及用于创建此类实体和编辑现有实体的两个子路由。实体列表附有一个resolver
附件,用于在显示之前为组件预取数据。这些路线可以总结如下,请进一步了解这些路线在代码中的描述方式。
- 指数:
/items
- 创造:
/items/create
- 编辑:
/items/:itemId/edit
但是,如果我在/items/create
,并成功创建了一个项目,导航“返回”/items
或任何编辑路线,甚至返回/
不会导致我的解析器像我预期的那样获取更新的数据。尽管将runGuardsAndResolvers
属性设置为 "always"。我的理解是这个属性应该启用我正在寻找的功能。
为什么会这样,以及如何启用我正在寻找的功能,而无需执行诸如订阅组件中的路由器事件和复制逻辑之类的操作。
路线
const itemRoutes: Routes = [
{
path: '', // nb: this is a lazily loaded module that is itself a child of a parent, the _actual_ path for this is `/items`.
runGuardsAndResolvers: 'always',
component: ItemsComponent,
data: {
breadcrumb: 'Items'
},
resolve: {
items: ItemsResolver
},
children: [
{
path: 'create',
component: CreateItemComponent,
data: {
breadcrumb: 'Create Item'
}
},
{
path: ':itemId/edit',
component: EditOrArchiveItemComponent,
data: {
breadcrumb: 'Editing Item :item.name'
},
resolve: {
item: ItemResolver
}
}
]
}
];
物品解析器
@Injectable()
export class ItemsResolver implements Resolve<ItemInIndex[]> {
public constructor(public itemsHttpService: ItemsHttpService, private router: Router) {}
public resolve(ars: ActivatedRouteSnapshot, rss: RouterStateSnapshot): Observable<ItemInIndex[]> {
return this.itemsHttpService.index().take(1).map(items => {
if (items) {
return items;
} else {
this.router.navigate(['/']);
return null;
}
});
}
}
项目HttpService
(应要求发布)
@Injectable()
export class ItemsHttpService {
public constructor(private apollo: Apollo) {}
public index(): Observable<ItemInIndex[]> {
const itemsQuery = gql`
query ItemsQuery {
items {
id,
name
}
}
`;
return this.apollo.query<any>({
query: itemsQuery
}).pipe(
map(result => result.data.items)
);
}
}