浅析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 相关文章推荐
解决extjs在firefox中关闭窗口再打开后iframe中js函数访问不到的问题
Nov 06 Javascript
js列举css中所有图标的实现代码
Jul 04 Javascript
Ubuntu 11.10 安装Node.js的方法
Nov 30 Javascript
window.requestAnimationFrame是什么意思,怎么用
Jan 13 Javascript
鼠标经过tr时,改变tr当前背景颜色
Jan 13 Javascript
Jquery树插件zTree用法入门教程
Feb 17 Javascript
jQuery插件windowScroll实现单屏滚动特效
Jul 14 Javascript
JS简单获取及显示当前时间的方法
Aug 03 Javascript
微信JSSDK调用微信扫一扫功能的方法
Jul 25 Javascript
vue主动刷新页面及列表数据删除后的刷新实例
Sep 16 Javascript
Webpack4 使用Babel处理ES6语法的方法示例
Mar 07 Javascript
vue设置全局访问接口API地址操作
Aug 14 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 身份证号验证函数
2009/05/07 PHP
php skymvc 一款轻量、简单的php
2011/06/28 PHP
PHP严重致命错误处理:php Fatal error: Cannot redeclare class or function
2017/02/05 PHP
几个常用的JavaScript字符串处理函数 - split()、join()、substring()和indexOf()
2009/06/02 Javascript
JavaScript Konami Code 实现代码
2009/07/29 Javascript
(jQuery,mootools,dojo)使用适合自己的编程别名命名
2010/09/14 Javascript
Jquery右下角抖动、浮动 实例代码(兼容ie6、FF)
2013/08/15 Javascript
JS:window.onload的使用介绍
2013/11/13 Javascript
Nodejs极简入门教程(三):进程
2014/10/27 NodeJs
如何减少浏览器的reflow和repaint
2015/02/26 Javascript
Jquery1.9.1源码分析系列(十五)动画处理之外篇
2015/12/04 Javascript
canvas仿iwatch时钟效果
2017/03/06 Javascript
解决layui数据表格Date日期格式的回显Object的问题
2019/09/19 Javascript
layui form表单提交后实现自动刷新
2019/10/25 Javascript
[55:04]海涛DOTA2死魂复燃6.82版本介绍
2014/09/28 DOTA
[01:14:41]DOTA2-DPC中国联赛定级赛 iG vs Magma BO3第一场 1月8日
2021/03/11 DOTA
Python实现查看系统启动项功能示例
2018/05/10 Python
python中计算一个列表中连续相同的元素个数方法
2018/06/29 Python
用Python实现读写锁的示例代码
2018/11/05 Python
Python交互式图形编程的实现
2019/07/25 Python
python3.7实现云之讯、聚合短信平台的短信发送功能
2019/09/26 Python
python对接ihuyi实现短信验证码发送
2020/05/10 Python
Python爬虫爬取新闻资讯案例详解
2020/07/14 Python
CSS3 Media Queries详细介绍和使用实例
2014/05/08 HTML / CSS
美国女孩洋娃娃店:American Girl
2017/10/24 全球购物
帕克纽约:PARKER NY
2018/12/09 全球购物
Python面试题集
2012/03/08 面试题
小学庆六一活动方案
2014/02/28 职场文书
实验室的标语
2014/06/20 职场文书
学习雷锋标语
2014/06/25 职场文书
项目申报专员岗位职责
2014/07/09 职场文书
2014年财务人员工作总结
2014/11/11 职场文书
学生上课迟到检讨书
2015/01/01 职场文书
检讨书怎么写
2015/05/07 职场文书
《赵州桥》教学反思
2016/02/17 职场文书
Redis 报错 error:NOAUTH Authentication required
2022/05/15 Redis