浅析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 实现??打印?理
Apr 28 Javascript
JavaScript Sort 表格排序
Oct 31 Javascript
JavaScript 常用函数
Dec 30 Javascript
css值转换成数值请抛弃parseInt
Oct 24 Javascript
解析Javascript小括号“()”的多义性
Dec 03 Javascript
JS判断是否长按某一键的方法
Mar 02 Javascript
全面解析bootstrap格子布局
May 22 Javascript
浅谈关于.vue文件中style的scoped属性
Aug 19 Javascript
用js实现before和after伪类的样式修改的示例代码
Sep 07 Javascript
vue.js模仿京东省市区三级联动的选择组件实例代码
Nov 22 Javascript
JavaScript监听触摸事件代码实例
Dec 30 Javascript
vue.js封装switch开关组件的操作
Oct 26 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设置编码格式的方法
2013/03/05 PHP
Flash对联广告的关闭按钮讨论
2007/01/30 Javascript
javascript 动态调整图片尺寸实现代码
2009/12/28 Javascript
ExtJS4 组件化编程,动态加载,面向对象,Direct
2011/05/12 Javascript
JavaScript入门之对象与JSON详解
2011/10/21 Javascript
IE的有条件注释判定IE版本详解(附实例代码)
2012/01/04 Javascript
根据邮箱的域名跳转到相应的登录页面的代码
2012/02/27 Javascript
同时使用n个window onload加载实例介绍
2013/04/25 Javascript
学习JavaScript设计模式之模板方法模式
2016/01/20 Javascript
JS动态加载脚本并执行回调操作
2016/08/24 Javascript
微信小程序 开发指南详解
2016/09/27 Javascript
解析如何利用iframe标签以及js制作时钟
2016/12/08 Javascript
史上最全JavaScript数组去重的十种方法(推荐)
2017/08/17 Javascript
Angular2.0/4.0 使用Echarts图表的示例代码
2017/12/07 Javascript
微信小程序App生命周期详解
2018/01/31 Javascript
Angular4集成ng2-file-upload的上传组件
2018/03/14 Javascript
防止Layui form表单重复提交的实现方法
2019/09/10 Javascript
Nodejs实现图片上传、压缩预览、定时删除功能
2019/10/25 NodeJs
原生js+ajax分页组件
2020/01/30 Javascript
微信小程序实现电子签名功能
2020/07/29 Javascript
[10:24]郎朗助力完美“圣”典,天籁交织奏响序曲
2016/12/18 DOTA
[56:21]LGD vs IG 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
Python使用numpy产生正态分布随机数的向量或矩阵操作示例
2018/08/22 Python
python RSA加密的示例
2020/12/09 Python
Matplotlib配色之Colormap详解
2021/01/05 Python
html5本地存储之localstorage 、本地数据库、sessionStorage简单使用示例
2014/05/08 HTML / CSS
常用的HTML5列表标签
2017/06/20 HTML / CSS
html2canvas截图空白问题的解决
2020/03/24 HTML / CSS
美国Rue La La闪购网站:奢侈品、中高档品牌限时折扣
2016/10/19 全球购物
尤妮佳moony海外旗舰店:日本殿堂级纸尿裤品牌
2018/02/23 全球购物
经济贸易系求职信
2014/08/04 职场文书
生产工厂门卫岗位职责
2014/09/26 职场文书
教师拔河比赛广播稿
2014/10/14 职场文书
2014年社区矫正工作总结
2014/11/18 职场文书
《从现在开始》教学反思
2016/02/16 职场文书
table不让td文字溢出操作方法
2022/12/24 HTML / CSS