组件通讯,意在不同的指令和组件之间共享信息。
父->子 input
1 | // parent.html |
子->父 output
1 | // parent.html |
子获取父实例
1 | // child.ts |
父获取子实例
1 | @ViewChild(ChildPage) child:ChildPage; |
service 公共的
1 | // parent.ts |
记得在app.module.ts 加上providers
EventEmitter(eventbus)
1 | // eventbus.service.ts |
订阅
1 | // service |
以上七种组件与组件的通讯方式,可以选择应用于适合的场景。
顺带介绍下重载当前路由,在Angular中,当点击当前路由的链接时,默认是忽略的。
糟糕的解决方案
- 跳出去,再跳回来。
- 让浏览器刷新整个页面。
然而目前我们可以通过
onSameUrlNavigation
来解决这个问题。
onSameUrlNavigation
有两个值’reload’和’ignore’。默认为’ignore’。
定义当路由器收到一个导航到当前 URL 的请求时应该怎么做。 默认情况下,路由器将会忽略这次导航。但这样会阻止类似于 “刷新” 按钮的特性。 使用该选项可以配置导航到当前 URL 时的行为。
路由启动配置
1
2// app.routing.module.ts
imports: [RouterModule.forRoot(routes, {onSameUrlNavigation: 'reload'})]reload
并不会真正的执行加载工作,它只是重新触发了路由上的events事件循环。也可以动态配置reload1
2
3
4this.router.onSameUrlNavigation = 'reload';
this.router.navigateByUrl(this.router.url).then(() => {
this.router.onSameUrlNavigation = 'ignore';
});Route配置 一系列的路由事件在何种情况下应该被触发,此时我们需要配置 runGuardsAndResolvers 选项,它有3个可选值。
paramsChange 只有当参数变化时才重新启动,例如 ‘article/:id’,参数指的就是这里的id。
paramsOrQueryParamsChange 当参数或查询参数变化时重新启动。例如:’article/:category?limit=10,参数指 ‘category’,查询参数指’limit’;
always 无论何种情况都重新启动
1 | export const routes: Routes = [ |
- 组件中处理路由事件
1
2
3
4
5
6
7
8
9
10
11
12export class ArticleComponent implement OnInit, OnDestroy {
subscription: Subscription;
constructor(private router: Router) { }
ngOnInit() {
this.subscription = this.router.events.pipe(
filter(event => event instanceOf NavigationEnd)
).subscribe(_ => {...}) // 执行业务操作
}
ngOnDestroy() {
this.subscription.unsubscribe(); // 不要忘记处理手动订阅
}
}