浅析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 相关文章推荐
客户端静态页面玩分页
Jun 26 Javascript
JavaScript 常用函数
Dec 30 Javascript
Date对象格式化函数代码
Jul 17 Javascript
javascript贪吃蛇完整版(源码)
Dec 09 Javascript
jQuery使用prepend()方法在元素前添加内容用法实例
Mar 26 Javascript
js实现简单的联动菜单效果
Aug 19 Javascript
JavaScript判断手机号运营商是移动、联通、电信还是其他(代码简单)
Sep 25 Javascript
关于安卓手机微信浏览器中使用XMLHttpRequest 2上传图片显示字节数为0的解决办法
May 17 Javascript
bootstrap的工具提示实例代码
May 17 Javascript
JavaScript canvas绘制渐变颜色的矩形
Feb 18 Javascript
解决vue-loader加载不上的问题
Oct 21 Javascript
解决vue init webpack 下载依赖卡住不动的问题
Nov 09 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中如何判断AJAX提交的数据
2012/02/05 PHP
基于PHP服务端图片生成缩略图的方法详解
2013/06/20 PHP
php按单词截取字符串的方法
2015/04/07 PHP
PHP7新增函数
2021/03/09 PHP
javascript 词法作用域和闭包分析说明
2010/08/12 Javascript
javascript 获取图片尺寸及放大图片
2013/09/04 Javascript
javascript实现类似超链接的效果
2014/12/26 Javascript
网页中JS函数自动执行常用三种方法
2016/03/30 Javascript
EasyUI加载完Html内容样式渲染完成后显示
2016/07/25 Javascript
jQuery插件EasyUI设置datagrid的checkbox为禁用状态的方法
2016/08/05 Javascript
jQuery Ajax使用FormData对象上传文件的方法
2016/09/07 Javascript
利用vue.js把静态json绑定bootstrap的table方法
2018/08/28 Javascript
JavaScript设计模式之享元模式实例详解
2019/01/17 Javascript
vue使用Font Awesome的方法步骤
2019/02/26 Javascript
微信小程序实现多选框全选与取消全选功能示例
2019/05/14 Javascript
layui使用templet格式化表格数据的方法
2019/09/16 Javascript
Vue axios获取token临时令牌封装案例
2020/09/11 Javascript
有关wxpython pyqt内存占用问题分析
2014/06/09 Python
解决python 3 urllib 没有 urlencode 属性的问题
2019/08/22 Python
如何基于pythonnet调用halcon脚本
2020/01/20 Python
PyCharm如何导入python项目的方法
2020/02/06 Python
Python pyautogui模块实现鼠标键盘自动化方法详解
2020/02/17 Python
python爬虫中的url下载器用法详解
2020/11/30 Python
澳大利亚电子产品购物网站:Dick Smith
2017/02/02 全球购物
美国战术品牌:5.11 Tactical
2019/05/01 全球购物
三星法国官方网站:Samsung法国
2019/10/31 全球购物
Under Armour安德玛意大利官网:美国高端运动科技品牌
2020/01/16 全球购物
《小松树和大松树》教学反思
2014/02/20 职场文书
迁户口计划生育证明
2014/10/19 职场文书
2015年度个人教学工作总结
2015/05/20 职场文书
2015年环保局工作总结
2015/05/22 职场文书
2015年政治教研组工作总结
2015/07/22 职场文书
六一儿童节园长致辞
2015/07/31 职场文书
《平行四边形的面积》教学反思
2016/02/16 职场文书
代码解析React中setState同步和异步问题
2021/06/03 Javascript
nginx配置指令之server_name的具体使用
2022/08/14 Servers