浅析Angular 实现一个repeat指令的方法


Posted in Javascript onJuly 21, 2019

在项目中常常会使用 ngFor指令,之前只会使用它,具体如何实现的却不得而知。终于这几天有时间"研究"了下它是如何实现的,顺便自己写个简单的 ngFor指令:repeat

说到指令就不得不提一下TemplateRef和ViewContainerRef

TemplateRef 可以理解为dom渲染模板,指令通过TemplateRef的模板来创建dom元素
ViewContainerRef 可以理解为TemplateRef的容器,在调用ViewContainerRef上的createEmbeddedView时,传入TemplateRef和context就能创建出dom元素 此外还需要说明的是Angular的微语法,详见下图。

浅析Angular 实现一个repeat指令的方法 

Angular会把微语法展开成ng-template的形式,支持传入参数, TemplateRef
所关联的则是ng-template内的内容,let variable则是声明变量,如果后面没有赋值操作,则这个变量取默认值。这里取值和createEmbeddedView方法的context相关(后面会细说)。

代码示例:

import { Directive, Input, TemplateRef, ViewContainerRef } from "@angular/core";
@Directive({
 selector: "[appRepeat]"
})
export class RepeatDirective {
 constructor(private tpl: TemplateRef<any>, private vc: ViewContainerRef) {}
 @Input() set appRepeatIn(val: Array<any>) {
  val.forEach((item, index) => {
   this.vc.createEmbeddedView(this.tpl, {
    $implicit: item,
    index: index,
    even: index % 2 === 0,
    odd: index % 2 === 1
   });
  });
 }
}
<ul>
 <li
  *appRepeat="
   let item;
   in: items;
   let index = index;
   let even = even;
   let odd = odd;
   let defualt
  "
 >
  <ul class="{{ even ? 'even' : 'odd' }}">
   <li>index: {{ index }}</li>
   <li>item: {{ item }}</li>
   <li>default: {{ defualt }}</li>
   <li>even: {{ even }}</li>
   <li>odd: {{ odd }}</li>
  </ul>
 </li>
</ul>

通过上面的代码可以知道:

let 声明变量(index,even,odd)可以使用createEmbeddedView方法传入context 的属性值(index,even,odd)进行赋值,如果只声明了变量并无赋值操作,则会使用context的属性值($implicit)进行赋值。

keyExp 为 Directive 声明Input属性,Directive的Input属性名格式为"[selector]key",遵循CamelCase命名规则,例如上面的例子:

selector: "appRepeat"
key: "in"

则命名为:"appRepeatIn"。

Directive 可以通过Input传入的数据来进行创建页面视图

总结:通过本文可以知道在Angular中如何创建一个简单的结构指令,指令展开的微语法(展开形式,传入数据,赋值操作),使用createEmbeddedViewTemplateRef来创建dom元素。如有疑问,可以查看源代码 或者在下面留言~

以上所述是小编给大家介绍的Angular 实现一个repeat指令的方法,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言小编会及时回复大家的!

Javascript 相关文章推荐
jQuery 剧场版 你必须知道的javascript
May 27 Javascript
div+css布局的图片连续滚动js实现代码
May 04 Javascript
再谈javascript原型继承
Nov 10 Javascript
理解javascript中的原型和原型链
Jul 30 Javascript
vue基于Vue2.0和高德地图的地图组件实例
Apr 28 Javascript
关于页面刷新vuex数据消失问题解决方案
Jul 03 Javascript
javascript实现循环广告条效果
Dec 12 Javascript
详解angular2.x创建项目入门指令
Oct 11 Javascript
jQuery实现数字自动增加或者减少的动画效果示例
Dec 11 jQuery
微信小程序实现简单跑马灯效果
May 26 Javascript
vue v-for 使用问题整理小结
Aug 04 Javascript
javascript实现点亮灯泡特效示例
Oct 15 Javascript
Node.js 实现简单的无侵入式缓存框架的方法
Jul 21 #Javascript
Vue中遍历数组的新方法实例详解
Jul 21 #Javascript
Vue项目中使用WebUploader实现文件上传的方法
Jul 21 #Javascript
jquery插件开发模式实例详解
Jul 20 #jQuery
JS回调函数原理与用法详解【附PHP回调函数】
Jul 20 #Javascript
JavaScript展开操作符(Spread operator)详解
Jul 20 #Javascript
JavaScript剩余操作符Rest Operator详解
Jul 20 #Javascript
You might like
虹吸壶煮咖啡26个注意事项
2021/03/03 冲泡冲煮
PHP结合Jquery和ajax实现瀑布流特效
2016/01/07 PHP
php计算多个集合的笛卡尔积实例详解
2017/02/16 PHP
PHP实现在数据库百万条数据中随机获取20条记录的方法
2017/04/19 PHP
PHP实现微信提现功能(微信商城)
2019/11/21 PHP
在IE上直接编辑网页内容的js代码(IE地址栏js)
2009/04/27 Javascript
jQuery对表单元素的取值和赋值操作代码
2011/05/19 Javascript
jQuery 顶部导航跟随滚动条滚动固定浮动在顶部
2014/06/06 Javascript
JS数组(Array)处理函数整理
2014/12/07 Javascript
JS结合bootstrap实现基本的增删改查功能
2016/07/22 Javascript
Bootstrap基本插件学习笔记之Alert警告框(20)
2016/12/08 Javascript
jQuery插件echarts实现的去掉X轴、Y轴和网格线效果示例【附demo源码下载】
2017/03/04 Javascript
ng2学习笔记之bootstrap中的component使用教程
2017/03/09 Javascript
vue.js实例todoList项目
2017/07/07 Javascript
vue 项目中使用Loading组件的示例代码
2018/08/31 Javascript
在layui中使用form表单监听ajax异步验证注册的实例
2019/09/03 Javascript
[01:04]DOTA2上海特锦赛现场采访 FreeAgain遭众解说围攻
2016/03/25 DOTA
python列表去重的二种方法
2014/02/14 Python
Python中XlsxWriter模块简介与用法分析
2018/04/24 Python
python实现定时提取实时日志程序
2018/06/22 Python
详解将Python程序(.py)转换为Windows可执行文件(.exe)
2019/07/19 Python
Python人工智能之路 之PyAudio 实现录音 自动化交互实现问答
2019/08/13 Python
在spyder IPython console中,运行代码加入参数的实例
2020/04/20 Python
python中如何进行连乘计算
2020/05/28 Python
python3实现名片管理系统(控制台版)
2020/11/29 Python
python中温度单位转换的实例方法
2020/12/27 Python
玩具反斗城西班牙网上商城:ToysRUs西班牙
2017/01/19 全球购物
意大利网上书店:LaFeltrinelli
2020/06/12 全球购物
英国奢侈品在线精品店:Hervia
2020/09/03 全球购物
安全责任协议书
2014/04/21 职场文书
竞选班委演讲稿
2014/04/28 职场文书
数学教研活动总结
2014/07/02 职场文书
小学国旗下的演讲稿
2014/08/28 职场文书
房屋买卖协议样本
2014/11/16 职场文书
家长反馈意见及建议
2015/06/03 职场文书
委托开发合同书(标准版)
2019/08/07 职场文书