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 相关文章推荐
Flash+XML滚动新闻代码 无图片 附源码下载
Nov 22 Javascript
JQuery 无废话系列教程(二) jquery实战篇上
Jun 23 Javascript
基于jQuery实现图片的前进与后退功能
Apr 24 Javascript
js类式继承的具体实现方法
Dec 31 Javascript
node.js中的http.get方法使用说明
Dec 14 Javascript
jQuery siblings()用法实例详解
Apr 26 Javascript
jQuery实现隔行变色的方法分析(对比原生JS)
Nov 18 Javascript
js获取浏览器和屏幕的各种宽度高度
Feb 22 Javascript
Vue 2.0学习笔记之Vue中的computed属性
Oct 16 Javascript
Vuex 入门教程
Jan 10 Javascript
JS基于ES6新特性async await进行异步处理操作示例
Feb 02 Javascript
ES6 Symbol在对象中的作用实例分析
Jun 06 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
PHP模板引擎SMARTY
2006/10/09 PHP
利用递归把多维数组转为一维数组的函数
2006/10/09 PHP
PHP实现二维数组中的查找算法小结
2018/06/09 PHP
JQuery 实现的页面滚动时浮动窗口控件
2009/07/10 Javascript
JavaScript中出现乱码的处理心得
2009/12/24 Javascript
自制基于jQuery的智能提示插件一枚
2011/02/18 Javascript
jQuery中removeData()方法用法实例
2014/12/27 Javascript
NodeJS使用jQuery选择器操作DOM
2015/02/13 NodeJs
jQuery简单实现验证邮箱格式
2015/07/15 Javascript
Bootstrap每天必学之按钮
2015/11/26 Javascript
Bootstrap Paginator分页插件使用方法详解
2016/05/30 Javascript
JS实现的适合做faq或menu滑动效果示例
2016/11/17 Javascript
vue.js中指令Directives详解
2017/03/20 Javascript
node结合swig渲染摸板的方法
2018/04/11 Javascript
angularjs使用div模拟textarea文本框的方法
2018/10/02 Javascript
使用Python编写简单网络爬虫抓取视频下载资源
2014/11/04 Python
python与caffe改变通道顺序的方法
2018/08/04 Python
Python设计模式之迭代器模式原理与用法实例分析
2019/01/10 Python
PyQt5基本控件使用详解:单选按钮、复选框、下拉框
2019/08/05 Python
使用 Supervisor 监控 Python3 进程方式
2019/12/05 Python
Python命令行参数定义及需要注意的地方
2020/11/30 Python
python绘图模块之利用turtle画图
2021/02/12 Python
.NET初级开发工程师面试题
2014/04/18 面试题
生物化工专业个人自荐信
2013/09/26 职场文书
送货司机岗位职责
2013/12/11 职场文书
团队经理竞聘书
2014/03/31 职场文书
人力资源管理专业应届生求职信
2014/04/24 职场文书
综合实践活动总结
2014/05/05 职场文书
爱心捐书活动总结
2014/07/05 职场文书
征用土地赔偿协议书
2014/09/26 职场文书
大学生助学金感谢信
2015/01/21 职场文书
2015年药房工作总结
2015/04/25 职场文书
2015年工程部工作总结
2015/04/30 职场文书
幼儿园班级工作总结2015
2015/05/25 职场文书
周恩来的四个昼夜观后感
2015/06/03 职场文书
Mysql官方性能测试工具mysqlslap的使用简介
2021/05/21 MySQL