jos*_*ley 8 angular2-routing angular2-resolve angular
在Angular2中我们可以使用Resolve
如下:
import { UserResolver } from './resolvers/user.resolver.ts';
export const routes: RouterConfig = [
{
path: 'users/:id',
component: UserComponent,
resolve: {
transaction: UserResolver
}
}
];
Run Code Online (Sandbox Code Playgroud)
但是,我怎样才能最好地应用解析器来运行,例如,我的app.component.ts
?也许当网站第一次加载时,无论首次加载哪个页面,我都需要先获取用户数据(例如).那么如何让这个解析器应用于路线层次结构的下方呢?
我一直在想同样的事情。
事实证明,如果对站点的初始请求是针对其组件之一由解析保护的路径,则解析将在实例化树中的任何组件之前运行。包括AppComponent
。
现在的问题是AppComponent
它本身不是路由组件,因此它无法访问解析的数据。也许您可以通过当前路由注入并访问ActivatedRoute
数据AppComponent
children
但这看起来很黑客。
我通常做的是在路由层次结构的根部设置一个解析(或CanActivate
保护)以获取初始数据。数据本身由服务返回并包装在. 这保证了 1) 数据将在所有订阅者之间共享;2)获取数据的代码只会执行一次。ReplaySubject
换句话说:
(但我没有使用路由系统来获取数据并共享它。)
更新回复评论:
你必须引入一个虚拟父路由来支持守卫,例如:
const routes: Routes = [
{
path: '', // This is the "root route"
component: PageShellComponent,
canActivate: [AuthGuard],
children: [
{ path: 'home', component: PageHomeComponent },
{ path: 'inbox', component: PageInboxComponent },
{ path: 'settings', component: PageSettingsComponent }
]
},
];
Run Code Online (Sandbox Code Playgroud)
父路由是“我的路由层次结构的根”,并且它的防护AuthGuard
针对应用程序中的所有子路由执行。正如你所看到的,父路由有一个空路径,并且PageShellComponent
的模板只包含<router-outlet></router-outlet>
. 这条路线的唯一目的是支持警卫。
我应该补充一点,它感觉不太惯用,而且我不确定这是最好的方法。
归档时间: |
|
查看次数: |
2957 次 |
最近记录: |