浅析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 写的一个简单的timer
Jul 30 Javascript
HTML颜色选择器实现代码
Nov 23 Javascript
IE6,IE7,IE8下使用Javascript记录光标选中范围(已补全)
Aug 28 Javascript
jQuery+ajax实现鼠标单击修改内容的方法
Jun 27 Javascript
JavaScript数组操作详解
Feb 04 Javascript
vue+vue-router转场动画的实例代码
Sep 01 Javascript
微信小程序提取公用函数到util.js及使用方法示例
Jan 10 Javascript
vue的for循环使用方法
Feb 12 Javascript
详解如何在Vue项目中导出Excel
Apr 19 Javascript
layUI实现列表查询功能
Jul 27 Javascript
vue 解决异步数据更新问题
Oct 29 Javascript
Vue实现导航栏的显示开关控制
Nov 01 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的魔术常量__METHOD__简介
2014/07/08 PHP
PHP实现加密的几种方式介绍
2015/02/22 PHP
Yii实现自动加载类地图的方法
2015/04/01 PHP
Mozilla 表达式 __noSuchMethod__
2009/04/05 Javascript
Javascript 中介者模式实例
2009/12/16 Javascript
Jquery中getJSON在asp.net中的使用说明
2011/03/10 Javascript
jquery鼠标滑过提示title具体实现代码
2013/08/06 Javascript
Get中文乱码IE浏览器Get中文乱码解决方案
2013/12/26 Javascript
jQuery实现垂直半透明手风琴特效代码分享
2015/08/21 Javascript
jQGrid动态填充select下拉框的选项值(动态填充)
2016/11/28 Javascript
vuejs开发组件分享之H5图片上传、压缩及拍照旋转的问题处理
2017/03/06 Javascript
判断div滑动到底部的scroll实例代码
2017/11/15 Javascript
vue给input file绑定函数获取当前上传的对象完美实现方法
2017/12/15 Javascript
vue 中的keep-alive实例代码
2018/07/20 Javascript
JQuery animate动画应用示例
2019/05/14 jQuery
js实现多张图片每隔一秒切换一张图片
2019/07/29 Javascript
layer弹出层显示在top顶层的方法
2019/09/11 Javascript
jquery轻量级数字动画插件countUp.js使用详解
2019/10/17 jQuery
vue简单封装axios插件和接口的统一管理操作示例
2020/02/02 Javascript
原生js中运算符及流程控制示例详解
2021/01/05 Javascript
Python面向对象class类属性及子类用法分析
2018/02/02 Python
Python机器学习算法之k均值聚类(k-means)
2018/02/23 Python
python DataFrame获取行数、列数、索引及第几行第几列的值方法
2018/04/08 Python
Python内建序列通用操作6种实现方法
2020/03/26 Python
sleep()方法和wait()方法的区别是什么
2012/11/17 面试题
怎样有效的进行自我评价
2013/10/06 职场文书
婚礼主持词开场白
2014/03/13 职场文书
《春晓》教学反思
2014/04/20 职场文书
六年级学生评语
2014/04/22 职场文书
优质服务口号
2014/06/11 职场文书
村委会贫困证明范本
2014/09/17 职场文书
校友会致辞
2015/07/30 职场文书
小学五年级(说明文3篇)
2019/08/13 职场文书
MySQL 全文检索的使用示例
2021/06/07 MySQL
MySQL 表锁定 LOCK和UNLOCK TABLES的 SQL语法
2022/04/18 MySQL
Docker安装MySql8并远程访问的实现
2022/07/07 Servers