“你他娘的懂个屁!”李虎狠狠骂了一声,而后严肃的吩咐道:“跟下面所有兄弟打个招呼,以后在凤鸣市,但凡遇到王小民和他的车,都给我恭敬着点,不然别怪我不客气。”

Angular:利用内容投射向组件输入ngForOf模板


现在,我们写一个组件puppiesListCmp,用于显示小狗狗的列表:

//puppies-list.component.ts
@Component({
  selector: "puppies-list",
  template: `
    <div *ngFor="let puppy of puppies">
      <span>{{puppy.name}}</span>
      <span>{{puppy.age}}</span>
      <span>{{puppy.color}}</span>
    </div>
`
})
export class puppiesListCmp{
  @Input() puppies: Puppy[];
}
interface Puppy {
  name: string,
  age: number,
  color: string
}

然后这样使用:

//app.component.ts
@Component({
  selector: "my-app",
  template: `
    <puppies-list [puppies]="puppies"></puppies-list>
`
})
export class App{
  puppies = [
    {
      name: "sam",
      age: 0.6,
      color: "yellow"
    },
    {
      name: "bingo",
      age: 1.5,
      color: "black"
    }
  ]
}

效果就行这样:

但是,我希望我们的puppiesListCmp组件可以满足不同的需求,比如在数据不变的情况下只显示小狗狗的name和color,就像这样:

这就是本文的重点了。我们需要实现用户自定义模板!
现在我们不写死组件的模板了,而是让用户从外部输入!
首先,我们的组件模板:

<div *ngFor="let puppy of puppies">
      <span>{{puppy.name}}</span>
      <span>{{puppy.age}}</span>
      <span>{{puppy.color}}</span>
</div>

等价于:

<ng-template ngFor let-puppy [ngForOf]="puppies">
      <div>
        <span>{{puppy.name}}</span>
        <span>{{puppy.age}}</span>
        <span>{{puppy.color}}</span>
      </div>
</ng-template>

然后,用@ContentChild(关于@ContentChild可以查看这里,需FQ)获取到外部(相对puppiesListCmp组件而言)自定义模板,并赋给ngForTemplate。也就是说,这部分:

<div>
    <span>{{puppy.name}}</span>
    <span>{{puppy.age}}</span>
    <span>{{puppy.color}}</span>
</div>

不再像之前那样写死在组件里了,而是由使用者在父组件中自定义,然后利用Angular的内容投射(Content Projection),投射到puppiesListCmp组件里面。就像这样:

//puppies-list.component.ts
import { Component, Input, ContentChild, TemplateRef } from "@angular/core";
import { NgForOfContext } from "@angular/common";
@Component({
  selector: "puppies-list",
  template: `
<ng-template ngFor let-puppy [ngForOf]="puppies" [ngForTemplate]="tpl"></ng-template>
`
})
export class puppiesListCmp{
  @Input() puppies: Puppy[];
  @ContentChild(TemplateRef) tpl: TemplateRef<NgForOfContext<Puppy>>
}
interface Puppy {
  name: string,
  age: number,
  color: string
}

这样我们的组件就算完成了。然后我们使用它:

//app.component.ts
@Component({
  selector: "my-app",
  template: `
<puppies-list [puppies]="puppies">
  <ng-template let-puppy>
    <div>
      <span>{{puppy.name}}</span>
      <span>{{puppy.age}}</span>
      <span>{{puppy.color}}</span>
    </div>
  </ng-template>
</puppies-list>
`
})

效果还是一样的:

如果我们只要显示小狗狗的name和color,只要这样写就好了:

//app.component.ts
@Component({
  selector: "my-app",
  template: `
<puppies-list [puppies]="puppies">
  <ng-template let-puppy>
    <div>
      <span>{{puppy.name}}</span>
      <span>{{puppy.color}}</span>
    </div>
  </ng-template>
</puppies-list>
`
})

效果就像这样:

这样的组件很灵活,想要什么样的效果都可以定制,这就实现了组件的复用。
好了,本文就到此为止了。不当之处,欢迎指出!

当前文章:http://hnhdqp.com/content/201810/17/content_80120.html

发布时间:2018-11-17 15:32:36

app挂机赚钱是真的 什么游戏能赚钱2018 如何赚快钱路子 头条赚客邀请码 简单任务赚钱 玩赚乐推荐欧洲城28 国外点击网赚论坛 詹姆斯钱多多 挣钱微信提现软件 如今投资

编辑:密董密

相关新闻

人人不抽烟 从愿景到现实还有多远

2018-11-17 07:28:05

崇左着日有限责任公司

退休教师收集两千余枚古化石

2018-11-17 03:07:29

五家渠排呵美术工作室

靖边县敬老院正式投入使用

2018-11-17 04:49:03

扬中颗虐代理记账有限公司

苹果再陷弯弯门 iPhone5S再次被坐弯

2018-11-17 15:28:18

诸暨瞥邻集团公司

热门推荐

  • “天眼”FAST已发现9颗脉冲星
  • 杨元庆:我坚定认为AI无威胁
  • 初识Redux-Saga
  • 霍尊惊喜揭面 百变唱将倾力为三元冰岛式酸奶站台
  • 贾跃亭发内部信一周年:乐视脑死亡阴影下的365天
  • 国考补录3日起报名 4127个名额可供“捡漏”
  • 什么样的兴趣班更适合我的孩子?
  • 江西8市发生严重暴雨洪涝灾难 7人罹难7人失踪
  • 茂县救援现场:十几名战士听到女性呼唤
  • 成都鼓访金融集团
  • 河北新闻网版权所有 本站点信息未经允许不得复制或镜像 法律顾问:手机赚钱软件一天60 手机锁屏赚钱软件排行
  • 找兼职手工活在家做 copyright ? 2000 - 2016
  • 新闻热线:0311-67563366 广告热线:0311-67562966 新闻投诉:0311-67562994
  • 冀ICP备 09047539号-1 | 互联网新闻信息服务许可证编号:1312006002
  • 广播电视节目制作经营许可证(冀)字第101号|信息网络传播视听节目许可证0311618号
  • 打码网上兼职赚钱是真的吗 日结+居家兼职 微信赚钱项目 43626游戏