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 相关文章推荐
domReady的实现案例
Nov 23 Javascript
jQuery实现背景滑动菜单
Dec 02 Javascript
如何在Angular2中使用jQuery及其插件的方法
Feb 09 Javascript
Angular.js通过自定义指令directive实现滑块滑动效果
Oct 13 Javascript
如何让你的JS代码更好看易读
Dec 01 Javascript
jQuery 防止相同的事件快速重复触发方法
Feb 08 jQuery
vue 根据数组中某一项的值进行排序的方法
Aug 30 Javascript
JS使用对象的defineProperty进行变量监控操作示例
Feb 02 Javascript
JS实现json数组排序操作实例分析
Oct 28 Javascript
Paypal支付不完全指北
Jun 04 Javascript
jQuery开发仿QQ版音乐播放器
Jul 10 jQuery
Vuejs通过拖动改变元素宽度实现自适应
Sep 02 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 session 错误
2009/05/21 PHP
PHP第一季视频教程(李炎恢+php100 不断更新)
2011/05/29 PHP
解析PHP强制转换类型及远程管理插件的安全隐患
2014/06/30 PHP
PHP code 验证码生成类定义和简单使用示例
2020/05/27 PHP
奉献给JavaScript初学者的编写开发的七个细节
2011/01/11 Javascript
jQuery使用hide方法隐藏元素自身用法实例
2015/03/30 Javascript
jQuery判断指定id的对象是否存在的方法
2015/05/22 Javascript
Javascript中String的常用方法实例分析
2015/06/13 Javascript
HTML页面定时跳转方法解析(2种任选)
2016/12/22 Javascript
jQuery中的on与bind绑定事件区别实例详解
2017/02/28 Javascript
JavaScript实现前端实时搜索功能
2020/03/26 Javascript
Angular 4依赖注入学习教程之FactoryProvider配置依赖对象(五)
2017/06/04 Javascript
js中json对象和字符串的理解及相互转化操作实现方法
2017/09/22 Javascript
浅析从vue源码看观察者模式
2018/01/29 Javascript
jQuery each和js forEach用法比较
2019/02/27 jQuery
javascript实现的字符串转换成数组操作示例
2019/06/13 Javascript
VUE实现移动端列表筛选功能
2019/08/23 Javascript
解决layui checkbox 提交多个值的问题
2019/09/02 Javascript
微信小程序获取复选框全选反选选中的值(实例代码)
2019/12/17 Javascript
[01:03:56]Mineski vs TNC 2018国际邀请赛淘汰赛BO1 8.21
2018/08/22 DOTA
跟老齐学Python之集合的关系
2014/09/24 Python
Python 常用string函数详解
2016/05/30 Python
Python中最大最小赋值小技巧(分享)
2017/12/23 Python
Python基于dom操作xml数据的方法示例
2018/05/12 Python
Python OOP类中的几种函数或方法总结
2019/02/22 Python
tensorflow使用CNN分析mnist手写体数字数据集
2020/06/17 Python
网页布局中CSS样式无效的十个重要原因详解
2017/08/10 HTML / CSS
adidas澳大利亚官方网站:adidas Australia
2018/04/15 全球购物
网络安全类面试题
2015/08/01 面试题
销售演讲稿范文
2014/01/08 职场文书
南京青奥会口号
2014/06/12 职场文书
单方离婚协议书范本(2014版)
2014/09/30 职场文书
2015毕业生简历自我评价
2015/03/02 职场文书
七年级作文(600字3篇)
2019/09/24 职场文书
Pytorch 统计模型参数量的操作 param.numel()
2021/05/13 Python
Python3使用Qt5来实现简易的五子棋小游戏
2022/05/02 Python