浅析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 相关文章推荐
JavaScript入门教程(5) js Screen屏幕对象
Jan 31 Javascript
jQuery+jqmodal弹出窗口实现代码分明
Jun 14 Javascript
jquery下onpropertychange事件的绑定方法
Aug 01 Javascript
getElementByIdx_x js自定义getElementById函数
Jan 24 Javascript
JS删除数组元素的函数介绍
Mar 27 Javascript
js替换字符串的所有示例代码
Jul 23 Javascript
js调用百度地图及调用百度地图的搜索功能
Sep 07 Javascript
Angular.JS判断复选框checkbox是否选中并实时显示
Nov 30 Javascript
jQuery实现的鼠标响应缓冲动画效果示例
Feb 13 jQuery
vue-cli3 从搭建到优化的详细步骤
Jan 20 Javascript
JS寄快递地址智能解析的实现代码
Jul 16 Javascript
原生Js 实现的简单无缝滚动轮播图的示例代码
May 10 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
提问的智慧
2006/10/09 PHP
php中sql注入漏洞示例 sql注入漏洞修复
2014/01/24 PHP
PHP实现克鲁斯卡尔算法实例解析
2014/08/22 PHP
Zend Framework分页类用法详解
2016/03/22 PHP
PHP使用pdo实现事务处理操作示例
2018/09/05 PHP
静态页面下用javascript操作ACCESS数据库(读增改删)的代码
2007/05/14 Javascript
js保留小数点后几位的写法
2014/01/03 Javascript
javascript检测浏览器的缩放状态实现代码
2014/09/28 Javascript
常用的jQuery前端技巧收集
2014/12/24 Javascript
JS实现很酷的EMAIL地址添加功能实例
2015/02/28 Javascript
jquery实现带渐变淡入淡出并向右依次展开的多级菜单效果实例
2015/08/22 Javascript
JavaScript给input的value赋值引发的关于基本类型值和引用类型值问题
2015/12/07 Javascript
Vue.js每天必学之指令系统与自定义指令
2016/09/07 Javascript
JavaScript中正则表达式判断匹配规则及常用方法
2017/08/03 Javascript
微信小程序实现添加手机联系人功能示例
2017/11/30 Javascript
jQuery实现评论模块
2020/08/19 jQuery
Python单例模式的两种实现方法
2017/08/14 Python
hmac模块生成加入了密钥的消息摘要详解
2018/01/11 Python
详解如何利用Cython为Python代码加速
2018/01/27 Python
python linecache 处理固定格式文本数据的方法
2019/01/08 Python
Python3中lambda表达式与函数式编程讲解
2019/01/14 Python
python 并发编程 阻塞IO模型原理解析
2019/08/20 Python
Python使用turtle库绘制小猪佩奇(实例代码)
2020/01/16 Python
利用Python裁切tiff图像且读取tiff,shp文件的实例
2020/03/10 Python
jupyter修改文件名方式(TensorFlow)
2020/04/21 Python
有趣的Python图片制作之如何用QQ好友头像拼接出里昂
2020/04/22 Python
如何在python中执行另一个py文件
2020/04/30 Python
Python实现CAN报文转换工具教程
2020/05/05 Python
解析python 中/ 和 % 和 //(地板除)
2020/06/28 Python
Python用K-means聚类算法进行客户分群的实现
2020/08/23 Python
美国美食礼品篮网站:Gourmet Gift Baskets
2019/12/15 全球购物
自荐书格式
2013/12/01 职场文书
一帮一活动总结
2014/05/08 职场文书
后勤管理员岗位职责
2014/08/27 职场文书
农行心得体会
2014/09/02 职场文书
喝酒驾驶检讨书
2014/10/01 职场文书