Angular利用内容投射向组件输入ngForOf模板的方法


Posted in Javascript onMarch 05, 2018

现在,我们写一个组件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"
  }
 ]
}

效果就行这样:

Angular利用内容投射向组件输入ngForOf模板的方法

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

Angular利用内容投射向组件输入ngForOf模板的方法

这就是本文的重点了。我们需要实现用户自定义模板!

现在我们不写死组件的模板了,而是让用户从外部输入!

首先,我们的组件模板:

<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>
`
})

效果还是一样的:

Angular利用内容投射向组件输入ngForOf模板的方法

如果我们只要显示小狗狗的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>
`
})

效果就像这样:

Angular利用内容投射向组件输入ngForOf模板的方法

这样的组件很灵活,想要什么样的效果都可以定制,这就实现了组件的复用。

好了,本文就到此为止了。不当之处,欢迎指出!希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JQuery 构建客户/服务分离的链接模型中Table分页代码效率初探
Jan 22 Javascript
jquery $.ajax相关用法分享
Mar 16 Javascript
简介AngularJS的视图功能应用
Jun 17 Javascript
JQuery实现的按钮倒计时效果
Dec 23 Javascript
JS实现左右无缝轮播图代码
May 01 Javascript
基于JavaScript实现购物网站商品放大镜效果
Sep 06 Javascript
微信小程序 Audio API详解及实例代码
Sep 30 Javascript
JS瀑布流实现方法实例分析
Dec 19 Javascript
vue-resource调用promise取数据方式详解
Jul 21 Javascript
JSON在Javascript中的使用(eval和JSON.parse的区别)详细解析
Sep 05 Javascript
对layui中表单元素的使用详解
Aug 15 Javascript
html5中sharedWorker实现多页面通信的示例代码
May 07 Javascript
axios全局请求参数设置,请求及返回拦截器的方法
Mar 05 #Javascript
axios拦截设置和错误处理方法
Mar 05 #Javascript
完美解决axios在ie下的兼容性问题
Mar 05 #Javascript
vue.js 使用axios实现下载功能的示例
Mar 05 #Javascript
Vue 中使用vue2-highcharts实现top功能的示例
Mar 05 #Javascript
Vue 中使用vue2-highcharts实现曲线数据展示的方法
Mar 05 #Javascript
vue项目中引入noVNC远程桌面的方法
Mar 05 #Javascript
You might like
IP攻击升级,程序改进以对付新的攻击
2010/11/23 PHP
php安全配置 如何配置使其更安全
2011/12/16 PHP
使用php批量删除数据库下所有前缀为prefix_的表
2014/06/09 PHP
PHP直接修改表内容DataGrid功能实现代码
2015/09/24 PHP
图片按比例缩放函数
2006/06/26 Javascript
判断iframe是否加载完成的完美方法
2010/01/07 Javascript
JavaScript中两种链式调用实现代码
2011/01/12 Javascript
jquery实现当滑动到一定位置时固定效果
2014/06/17 Javascript
jquery实现将获取的颜色值转换为十六进制形式的方法
2014/12/20 Javascript
Bootstrap表单Form全面解析
2016/06/13 Javascript
ionic实现可滑动的tab选项卡切换效果
2020/04/15 Javascript
JS中双击和单击事件冲突的解决方法
2018/04/09 Javascript
webpack4的迁移的使用方法
2018/05/25 Javascript
单线程JavaScript实现异步过程详解
2020/05/19 Javascript
[06:43]2018DOTA2国际邀请赛寻真——VGJ.Thunder
2018/08/11 DOTA
python批量同步web服务器代码核心程序
2014/09/01 Python
Python多进程multiprocessing用法实例分析
2017/08/18 Python
Python使用numpy实现BP神经网络
2018/03/10 Python
在Python中COM口的调用方法
2019/07/03 Python
Python Pandas对缺失值的处理方法
2019/09/27 Python
Python多线程正确用法实例解析
2020/05/30 Python
Python Switch Case三种实现方法代码实例
2020/06/18 Python
canvas绘制树形结构可视图形的实现
2020/04/03 HTML / CSS
详解HTML5.2版本带来的修改
2020/05/06 HTML / CSS
加拿大健康、婴儿和美容产品在线购物:Well.ca
2016/11/30 全球购物
阿迪达斯香港官网:adidas香港
2019/11/09 全球购物
开发中都用到了那些设计模式?用在什么场合?
2014/08/21 面试题
初中生学习的自我评价
2013/11/14 职场文书
策划创业计划书
2014/02/06 职场文书
部门活动策划方案
2014/08/16 职场文书
小学向国旗敬礼活动方案
2014/09/27 职场文书
元宵节晚会主持词
2015/07/01 职场文书
2016年企业安全生产月活动总结
2016/04/06 职场文书
党组织关系的介绍信模板
2019/06/21 职场文书
详解缓存穿透击穿雪崩解决方案
2021/05/28 Redis
Android Studio实现简易进制转换计算器
2022/05/20 Java/Android