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 相关文章推荐
js下关于onmouseout、事件冒泡的问题经验小结
Dec 09 Javascript
一个简单的js树形菜单
Dec 09 Javascript
鼠标滑在标题上显示图片的JS代码
Nov 19 Javascript
解析Javascript中大括号“{}”的多义性
Dec 02 Javascript
JavaScript获取路径设计源码
May 22 Javascript
jquery对象和DOM对象的任意相互转换
Feb 21 Javascript
使用smartupload组件实现jsp+jdbc上传下载文件实例解析
Jan 05 Javascript
jquery 一键复制到剪切板的实例
Sep 20 jQuery
基于webpack4.X从零搭建React脚手架的方法步骤
Dec 23 Javascript
Vue form表单动态添加组件实战案例
Sep 02 Javascript
JS实现音乐钢琴特效
Jan 06 Javascript
Vue项目移动端滚动穿透问题的实现
May 19 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
基于session_unset与session_destroy的区别详解
2013/06/03 PHP
将php数组输出html表格的方法
2014/02/24 PHP
解决PhpMyAdmin中导入2M以上大文件限制的方法分享
2014/06/06 PHP
PHP数据库表操作的封装类及用法实例详解
2016/07/12 PHP
Laravel框架实现model层的增删改查(CURD)操作示例
2018/05/12 PHP
php + ajax 实现的写入数据库操作简单示例
2020/05/16 PHP
广告显示判断
2006/08/31 Javascript
JXTree对象,读取外部xml文件数据,生成树的函数
2007/04/02 Javascript
超越Jquery_01_isPlainObject分析与重构
2010/10/20 Javascript
JavaScript Memoization 让函数也有记忆功能
2011/10/27 Javascript
Javascript中 关于prototype属性实现继承的原理图
2013/04/16 Javascript
jQuery把表单元素变为json对象
2013/11/06 Javascript
如何编写高质量JS代码(续)
2015/02/25 Javascript
jQuery Ajax传值到Servlet出现乱码问题的解决方法
2016/10/09 Javascript
Angularjs的键盘事件的绑定
2017/07/27 Javascript
vue数字类型过滤器的示例代码
2017/09/07 Javascript
vue新vue-cli3环境配置和模拟json数据的实例
2018/09/19 Javascript
vue.config.js常用配置详解
2019/11/14 Javascript
[01:00:30]完美世界DOTA2联赛循环赛 Inki vs Matador BO2第二场 10.31
2020/11/02 DOTA
浅谈Python里面小数点精度的控制
2018/07/16 Python
Python提取转移文件夹内所有.jpg文件并查看每一帧的方法
2019/06/27 Python
python基于event实现线程间通信控制
2020/01/13 Python
python+selenium+Chrome options参数的使用
2020/03/18 Python
python安装后的目录在哪里
2020/06/21 Python
2014年大学生党课心得体会范文
2014/03/29 职场文书
大气污染防治方案
2014/05/19 职场文书
预防煤气中毒方案
2014/06/16 职场文书
党员目标管理责任书
2014/07/25 职场文书
公司委托书格式范本
2014/09/16 职场文书
单身证明范本
2015/06/15 职场文书
红色故事汇观后感
2015/06/18 职场文书
vue组件的路由高亮问题解决方法
2021/05/11 Vue.js
PyTorch 如何设置随机数种子使结果可复现
2021/05/12 Python
python 实现体质指数BMI计算
2021/05/26 Python
Java 轮询锁使用时遇到问题
2022/05/11 Java/Android
使用scrapy实现增量式爬取方式
2022/06/21 Python