【发布时间】:2017-10-29 04:02:20
【问题描述】:
考虑以下路由配置:
const routes: Routes = [
{
path: '',
component: AppComponent,
resolve: {
app: AppResolver
},
children: [
{
path: 'user/:uid',
resolve: {
user: UserResolver
},
children: [
{
path: '',
component: ViewUserComponent
},
{
path: 'edit',
component: EditUserComponent
}
]
}
]
}
];
UserResolver 为路由 /user/:uid 的任何子级检索用户数据。
使用此数据,可以通过导航至/user/:uid 查看用户配置文件,然后通过导航至/user/:uid/edit 进行编辑。
成功编辑后,预计会被重定向到用户的更新个人资料 (/user/:uid)。
但是,视图和编辑页面都是已解析路由的子页面,从一个导航到另一个时不会触发解析器。
因此,当从编辑组件导航回视图组件时,显示的数据仍然是旧的、未更新的数据。
是否有任何方法使解析的user 数据无效以强制解析器从服务器再次获取它?或者有没有其他方法可以达到这种效果?
app 数据没有改变,我们不应该重新加载它。
【问题讨论】:
-
使用共享服务而不是父组件来处理数据。
-
@HarryNinh 我可以,但这意味着复制订阅路由参数的代码并在每个子组件中调用服务,同时在共享服务中重新实现缓存策略。这似乎违背了路由解析器的目的。
-
关于这个主题的大量搜索。据我所知,处理此问题的唯一方法是订阅事件并手动重新加载数据。理想情况下,您会构建应用程序。这样您就可以通过代码重用来做到这一点,但即使这样也是一个挑战,因为重用 Resolve 并不是因为获取路由器状态而变得微不足道。我选择在我的 Resolve 中创建一个公共函数,可以重复使用并绕过 resolve 函数本身。这是一个可以改进的明确领域。我见过很多人遇到这种问题。
标签: angular typescript angular2-router