Angular 之 named outlet

Posted Angular完全开发手册

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Angular 之 named outlet相关的知识,希望对你有一定的参考价值。

named outlet 顾名思义,就是有名字的 router-outlet。

平时我们使用的outlet都是这样的:

 
   
   
 
  1. <router-outlet></router-outlet>

named outlet 是这样的:

 
   
   
 
  1. <router-outlet name="popup"></router-outlet>

多了个name属性。其实,每一个outlet都有name。我们平时没有写name的outlet,它有一个默认name:primary,相当于:

 
   
   
 
  1. <router-outlet name="primary"></router-outlet>

要这么多outlet有什么用?

用处太多了,因为网页中展示的内容不再局限于一个outlet,你可以在网页的不同位置,展示不同的内容。包括但不限于弹出窗口,confirm,还有广告。。。

我想让窗口的右下角出现一个弹窗,里面有四个字:联系客服。重要的是,我需要在任意页面,都可以控制弹窗的出现和隐藏。如何实现?

首先,我要在根模板中加入一个named outlet

 
   
   
 
  1. // app.component.html

  2. <router-outlet></router-outlet>

  3. <router-outlet name="popup"></router-outlet>

我想让联系客服这个组件出现在 popup 这个outlet中。创建组件:

 
   
   
 
  1. @Component({

  2.    selector:'app-concat',

  3.    template:`<div>联系客服</div>`,

  4.    styles:[

  5.        `div{

  6.            position:fixed;

  7.            width: 200px;

  8.            height: 100px;

  9.            right: 0;

  10.            bottom: 0;

  11.            background: #fff;

  12.        }`

  13.    ]

  14. })

  15. class ConcatComponent{

  16. }

可以想象,这个组件是比较丑的,这是另外一个话题。接下来,我们既然想让他显示在router-outlet中,肯定要配置路由才是。

 
   
   
 
  1. // app-routing.module.ts

  2. const routes:Routes = [

  3.    //...

  4.    {path:'concat',component:ConcatComponent,outlet:'popup'}

  5.    //...

  6. ];

不要指望手工改变url这个路由就会显示出对应的组件,因为named outlet解析出来的url不一样。先看一下如何添加 link 来指向这个路由。

 
   
   
 
  1. // app.component.html

  2. <a [routerLink]="[{outlets:{'popup':'concat'}}]">concat</a>

意思是,要在name为popup的router-outlet上挂载组件,挂载哪个组件?挂载路由定义中 path 为 concat 的路由指定的组件。

在组件成功显示出来后,剩下的问题就是如何关闭它了。可以在页面上任意位置,包括ConcatComponent内部建立一个关闭按钮。

 
   
   
 
  1. <button (click)="closePopup()">

  2.    close

  3. </button>

对应的方法

 
   
   
 
  1. closePopUp(){

  2.    this.router.navigate([

  3.        {outlets:{popup:null}}

  4.    ])

  5. }

是的,让其显示的路由路径为null,就会清空该路由上挂载的所有组件。你可以用这个特性来实现很多东西!


以上是关于Angular 之 named outlet的主要内容,如果未能解决你的问题,请参考以下文章

Angular `<router-outlet>` 显示模板两次

如果 'router-outlet' 是一个 Angular 组件,那么验证它是这个模块的一部分

Angular 2 与 <router-outlet> 组件通信

Angular 4:未执行 <router-outlet> 中的自定义属性指令

Angular 2 Activatedroute 参数在服务中或 <router-outlet> 之外不起作用

理解顶层 <router-outlet> 和子模块 <router-outlet>