大段源码
/** |
画重点:
A router outlet is a placeholder that Angular dynamically fills based on the application’s route.
|
有上面的注释和构造看,这个基本上指令内是一些 旧 component 向新component跳转过程中要处理的东西
name属性是针对 AuxOutlet
的,以后再说
registerPrimaryOutlet - 是去更新此路由,可以理解为创建相应的Instruction tree
activate(nextInstruction: ComponentInstruction): Promise<any> { |
这块是新component即将加载的函数
- RouteData(额外带进来的其他参数) RouteParams(url里的参数) Router(router对象)
loadNextToLocation - 插在 RouterOutlet 所在元素的下面(同级别)
http://dreambo8563.github.io/2016/01/11/Angular2-DynamicComponentLoader-%E7%94%A8%E6%B3%95/
hasLifecycleHook(hookMod.routerOnActivate
检测新component里对OnActivate hook 有没有定义, 有的话就要调用
OnActivate — 有单独的地方说
<OnActivate>this._componentRef.instance
这个类型转换单独说下,以为上面判断新component里有OnActivate 定义了,所以这个instance 肯定符合这个interface
reuse(nextInstruction: ComponentInstruction): Promise<any> { |
同理这里是对OnReuse hook的检查和调用 isBlank(this._componentRef)
之前一定要经过activate 赋值的,也就是创建过的才可能reuse
deactivate(nextInstruction: ComponentInstruction): Promise<any> { |
在当前component销毁前要做的检查 OnDeactivate hook,如果有先执行next = PromiseWrapper.resolve(
(<OnDeactivate>this._componentRef.instance)
.routerOnDeactivate(nextInstruction, this._currentInstruction));
再this._componentRef.dispose();
this._componentRef = null;
routerCanDeactivate(nextInstruction: ComponentInstruction): Promise<boolean> { |
判断CanDeactivate hook
return PromiseWrapper.resolve( |
默认返回true 就是跳转, 如果这里return false 就是取消跳转
routerCanReuse(nextInstruction: ComponentInstruction): Promise<boolean> { |
看的新component是否和 当前是一样,如果一样,就能reuse,不能就新建一个。
注释:
If the new child component has a different Type than the existing child component,
this will resolve tofalse
. You can’t reuse an old component when the new component
is of a different Type.
Otherwise, this method delegates to the child component’srouterCanReuse
hook if it exists,
or resolves to true if the hook is not present.
这个 RouterOutlet 就是个过渡站,判断中间过程的各种hook。公交车调度,项目协调。。。
一个问题
什么时候 reuse
前提是多个路由里用了相同的组件, 这个时候用的是同一个instance
当然你可以变化一些参数如官网的例子
当你在CanReuse return true后, 在再
routerOnReuse 中传递新的变化参数。 不同路由间相同组件的通信手段
routerOnReuse(next: ComponentInstruction, prev: ComponentInstruction) {
this.name = next.params['name'];
}