浅析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 相关文章推荐
VBS通过WMI监视注册表变动的代码
Oct 27 Javascript
jQuery中setTimeout的几种使用方法小结
Apr 07 Javascript
浅析jquery的作用与优势
Dec 02 Javascript
Bootstrap每天必学之缩略图与警示窗
Nov 29 Javascript
微信小程序之仿微信漂流瓶实例
Dec 09 Javascript
ThinkJS中如何使用MongoDB的CURD操作
Dec 13 Javascript
详解AngularJS中$filter过滤器使用(自定义过滤器)
Feb 04 Javascript
vue实现简单表格组件实例详解
Apr 16 Javascript
Node调用Java的示例代码
Sep 20 Javascript
Three.js如何用轨迹球插件(trackball)增加对模型的交互功能详解
Sep 25 Javascript
微信小程序使用Vant Weapp组件库的方法步骤
Aug 01 Javascript
使用webpack将ES6转化ES5的实现方法
Oct 13 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
PHP中spl_autoload_register()和__autoload()区别分析
2014/05/10 PHP
PHP实现用户异地登录提醒功能的方法【基于thinkPHP框架】
2018/03/15 PHP
PHP children()函数讲解
2019/02/03 PHP
js变换显示图片的实例
2013/04/16 Javascript
JS、jquery实现几分钟前、几小时前、几天前等时间差显示效果的代码实例分享
2014/04/11 Javascript
浅谈jQuery中的事件
2015/03/23 Javascript
js实现字符串转日期格式的方法
2015/05/20 Javascript
jQuery解析XML文件同时动态增加js文件的方法
2015/06/01 Javascript
js闭包所用的场合以及优缺点分析
2015/06/22 Javascript
跟我学习javascript的this关键字
2020/05/28 Javascript
全面解析Bootstrap中tab(选项卡)的使用方法
2016/06/06 Javascript
JavaScript实现九九乘法表的简单实例
2016/06/07 Javascript
Angularjs 自定义服务的三种方式(推荐)
2016/08/02 Javascript
基于jQuery实现的幻灯图片切换
2016/12/02 Javascript
js调用刷新界面的几种方式
2017/05/03 Javascript
jQuery实现动态删除LI的方法
2017/05/30 jQuery
解决Extjs下拉框不显示的问题
2017/06/21 Javascript
浅谈angular.copy() 深拷贝
2017/09/14 Javascript
小程序点击图片实现自动播放视频
2020/05/29 Javascript
NodeJs 实现简单WebSocket即时通讯的示例代码
2019/08/05 NodeJs
vue 实现购物车总价计算
2019/11/06 Javascript
python3 与python2 异常处理的区别与联系
2016/06/19 Python
Python绘制七段数码管实例代码
2017/12/20 Python
python模块之paramiko实例代码
2018/01/31 Python
对python抓取需要登录网站数据的方法详解
2018/05/21 Python
python 判断矩阵中每行非零个数的方法
2019/01/26 Python
python实现二级登陆菜单及安装过程
2019/06/21 Python
Python调用C/C++的方法解析
2020/08/05 Python
英国足球店:UK Soccer Shop
2017/11/19 全球购物
英国布鲁姆精品店:Bloom Boutique
2018/03/01 全球购物
Bibloo荷兰:女士、男士和儿童的服装、鞋子和配饰
2019/02/25 全球购物
德国亚马逊官方网站:Amazon.de
2020/11/15 全球购物
个人担保书格式范文
2014/05/12 职场文书
2014年安全管理工作总结
2014/12/01 职场文书
党支部工作总结2015
2015/04/01 职场文书
Nginx服务器添加Systemd自定义服务过程解析
2021/03/31 Servers