浅析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 要点归纳(一) jQuery选择器
Mar 21 Javascript
jQuery+CSS3文字跑马灯特效的简单实现
Jun 25 Javascript
快速解决js中window.location.href不工作的问题
Nov 02 Javascript
jquery 一键复制到剪切板的实例
Sep 20 jQuery
BootStrap模态框不垂直居中的解决方法
Oct 19 Javascript
JavaScript反射与依赖注入实例详解
May 29 Javascript
JS实现换肤功能的方法实例详解
Jan 30 Javascript
js的继承方法小结(prototype、call、apply)(推荐)
Apr 17 Javascript
微信小程序常见页面跳转操作简单示例
May 01 Javascript
Vue 前端实现登陆拦截及axios 拦截器的使用
Jul 17 Javascript
js键盘事件实现人物的行走
Jan 17 Javascript
解决Vue router-link绑定事件不生效的问题
Jul 22 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中的一个中文字符串截取函数
2007/02/14 PHP
php操作xml入门之xml基本介绍及xml标签元素
2015/01/23 PHP
thinkphp微信开之安全模式消息加密解密不成功的解决办法
2015/12/02 PHP
Zend Framework开发入门经典教程
2016/03/23 PHP
PHP大文件分割上传 PHP分片上传
2017/08/28 PHP
laravel config文件配置全局变量的例子
2019/10/13 PHP
扩展String功能方法
2006/09/22 Javascript
javascript 多级checkbox选择效果
2009/08/20 Javascript
关于include标签导致js路径找不到的问题分析及解决
2013/07/09 Javascript
javascript的渐进增强与平稳退化浅谈
2013/11/12 Javascript
JS判断不能为空实例代码
2013/11/26 Javascript
JavaScript数据结构和算法之二叉树详解
2015/02/11 Javascript
JSON相关知识汇总
2015/07/03 Javascript
jQuery Easyui DataGrid点击某个单元格即进入编辑状态焦点移开后保存数据
2016/08/15 Javascript
javascript使用闭包模拟对象的私有属性和方法
2016/10/05 Javascript
Bootstrap table两种分页示例
2016/12/23 Javascript
jQuery异步提交表单实例
2017/05/30 jQuery
AngularJS实现的获取焦点及失去焦点时的表单验证功能示例
2017/10/25 Javascript
Vue中父子组件通讯之todolist组件功能开发
2018/05/21 Javascript
说说node中的可读流和可写流的区别
2018/06/01 Javascript
jQuery分组选择器简单用法示例
2019/04/04 jQuery
快速解决layui弹窗按enter键不停弹窗的问题
2019/09/18 Javascript
js+canvas实现五子棋小游戏
2020/08/02 Javascript
Python遍历目录的4种方法实例介绍
2015/04/13 Python
python 2.7.13 安装配置方法图文教程
2018/09/18 Python
Python使用reportlab模块生成PDF格式的文档
2019/03/11 Python
Python字典添加,删除,查询等相关操作方法详解
2020/02/07 Python
哪些是python中web开发框架
2020/06/17 Python
英国皇室御用百货:福南梅森(Fortnum & Mason)
2017/12/03 全球购物
总经理岗位职责范本
2014/02/02 职场文书
材料会计岗位职责
2014/03/06 职场文书
文化活动实施方案
2014/03/28 职场文书
操行评语大全
2014/04/30 职场文书
实习生矿工检讨书
2014/10/13 职场文书
2014年个人思想工作总结
2014/11/27 职场文书
Netty分布式客户端接入流程初始化源码分析
2022/03/25 Java/Android