Angular4学习笔记(八)- ng-content

内容投影

ng-content

ng-content是一个占位符,有些相似于router-outletsegmentfault

之前举の例子,父组件包含子组件都是直接指明子组件的selector,好比子组件的selectorapp-child,那么嵌入父组件时直接指明便可:app

<app-child></app-child>

这是很硬性的编码,而ng-content就是用来替代这种硬性编码的。编码

好比有个父组件这样定义:code

@Component({
  selector: 'app-parent',
  template: `
    <p>Parent Component</p>
    <div style="background: cyan">
      <ng-content></ng-content>
    </div>
  `
})

它表示被放进的内容的背景色统一设置为cyanrouter

接下来就要将子组件放入父组件中,放置的方式很简单,在根组件中将app-child插入到app-parent中便可:生命周期

<app-parent>
    <app-child></app-child>
</app-parent>

多个投影

上例中只有一个投影,那么多个投影怎么办呢?<ng-content> 支持一个 select 属性,能够让你在特定的地方投射具体的内容。该属性支持 CSS 选择器(my-element.my-class[my-attribute],...)来匹配你想要的内容。若是 ng-content 上没有设置 select 属性,它将接收所有内容,或接收不匹配任何其余 ng-content 元素的内容。element

好比父组件上有两个可投影的位置,一个背景为浅绿,一个为粉红:get

<div style="background: cyan">
      <ng-content select="[name=child]"></ng-content>
    </div>
    <div style="background: pink">
      <ng-content select=".red"></ng-content>
    </div>

此时能够在根组件上定义以下:string

<app-parent>
      <app-child class="red"></app-child>
      <app-child name="child"></app-child>
    </app-parent>

这样就能够对号入座了!it

ContentChild

理解了ng-content就能够使用@ContentChild装饰器来调用投影内容了,它和@ViewChild很是相似,就很少作介绍了,其异同点列举以下:

相同点

  • 都是属性装饰器
  • 都有对应的复数形式装饰器:ContentChildren、ViewChildren
  • 都支持 Type |Function|string 类型的选择器

不一样点

  • ContentChild 用来从经过 Content Projection 方式 (ng-content) 设置的视图中获取匹配的元素
  • ViewChild 用来从模板视图中获取匹配的元素
  • 在父组件的 ngAfterContentInit 生命周期钩子中才能成功获取经过 ContentChild 查询的元素
  • 在父组件的 ngAfterViewInit 生命周期钩子中才能成功获取经过 ViewChild 查询的元素

参考

相关文章
相关标签/搜索