浅析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 相关文章推荐
js中eval详解
Mar 30 Javascript
表格单元格交错着色实现思路及代码
Apr 01 Javascript
js中for in的用法示例解析
Dec 25 Javascript
js过滤特殊字符输入适合输入、粘贴、拖拽多种情况
Mar 22 Javascript
node.js中的querystring.stringify方法使用说明
Dec 10 Javascript
javascript实现树形菜单的方法
Jul 17 Javascript
理解jquery事件冒泡
Jan 03 Javascript
原生JS和jQuery版实现文件上传功能
Apr 18 Javascript
深入理解Vue-cli搭建项目后的目录结构探秘
Jul 13 Javascript
使用svg实现动态时钟效果
Jul 17 Javascript
JS实现给数组对象排序的方法分析
Jun 24 Javascript
vue.js实现只能输入数字的输入框
Oct 19 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数组函数序列之array_flip() 将数组键名与值对调
2011/11/07 PHP
PHP仿博客园 个人博客(2) 数据库增添改删
2013/07/05 PHP
laravel5.2实现区分前后台用户登录的方法
2017/01/11 PHP
Javascript 面向对象编程(一) 封装
2011/08/28 Javascript
JavaScript入门之对象与JSON详解
2011/10/21 Javascript
基于KMP算法JavaScript的实现方法分析
2013/05/03 Javascript
js的hasownproperty使用示例
2014/03/02 Javascript
教你用javascript实现随机标签云效果_附代码
2016/03/16 Javascript
jquery插件uploadify多图上传功能实现代码
2016/08/12 Javascript
JS实现课堂随机点名和顺序点名
2017/03/09 Javascript
ES6新特性之Object的变化分析
2017/03/31 Javascript
js学习总结_基于数据类型检测的四种方式(必看)
2017/07/04 Javascript
react-native使用react-navigation进行页面跳转导航的示例
2017/09/07 Javascript
vue2.0移动端滑动事件vue-touch的实例代码
2018/11/27 Javascript
[43:33]EG vs Spirit Supermajor 败者组 BO3 第一场 6.4
2018/06/05 DOTA
Python实现处理管道的方法
2015/06/04 Python
深入理解Python中命名空间的查找规则LEGB
2015/08/06 Python
python自动重试第三方包retrying模块的方法
2018/04/24 Python
python实现嵌套列表平铺的两种方法
2018/11/08 Python
numpy基础教程之np.linalg
2019/02/12 Python
Python 解决OPEN读文件报错 ,路径以及r的问题
2019/12/19 Python
Pytorch之保存读取模型实例
2019/12/30 Python
Python 下载Bing壁纸的示例
2020/09/29 Python
浅谈CSS3中display属性的Flex布局的方法
2017/08/14 HTML / CSS
Timberland俄罗斯官方网上商店:全球领先的户外品牌
2020/03/15 全球购物
什么是符号链接,什么是硬链接?符号链接与硬链接的区别是什么?
2014/01/19 面试题
自主招生自荐书
2013/11/29 职场文书
加工操作管理制度
2014/01/19 职场文书
小学生演讲稿大全
2014/04/25 职场文书
大队委竞选演讲稿
2014/04/28 职场文书
健康状况证明模板
2014/10/23 职场文书
2014年党的群众路线活动个人整改措施
2014/10/28 职场文书
2014年生产部工作总结
2014/12/17 职场文书
普通员工辞职信范文
2015/05/12 职场文书
解决numpy和torch数据类型转化的问题
2021/05/23 Python
用Python生成会跳舞的美女
2022/01/18 Python