详解Angular模板引用变量及其作用域


Posted in Javascript onNovember 23, 2018

Angular模板引用变量

如果你曾经参与过Angular项目的开发,那么你可能一眼就会看出谁将是本文的主角:

<input type="text" [value]="value" #name>

若你对此陌生,也无须在意。示例代码的<input>标签的属性中存在一个画风明显与其他属性不同的家伙——#name,这种以一个#开头命名,被附加在DOM元素上的属性,被称为模板引用变量(template reference variables)。

那么何为模板引用变量呢?文档是这样描述的:

A template reference variable is often a reference to a DOM element within a template. It can also be a reference to an Angular component or directive or a web component.

模板引用变量可以是Angualr模板中的DOM元素、Angular组件(指令),甚至Web组件的引用,而它具体是什么,则取决于它所依附的元素(不使用指令进行干预时)。如前文示例代码中的模板引用变量name就是<input>这一DOM元素的引用。

既然模板引用变量是模板中某一元素的引用,那理所当然地我们便可以通过这个引用变量" 触及 "该模板元素的" 实体 "。这在实际地开发中是十分实用的,考虑以下代码:

<app-component #component [input]="variable"></app-component>
{{ component.input }}
{{ component.func() }}

通过模板引用变量我们获得了app-component组件的实例引用,这使得我们可以轻松地在模板中访问app-component组件内部的成员。在某些情境下,这种能力给我们的开发提供了很大的助力。

模板引用变量的作用域

You can refer to a template reference variable anywhere in the template.

在文档中,官方毫不含糊地向我们表示:模板引用变量可以在模板中的任何地方使用。最骚的是,“任何地方”还被特别加粗。我们在大多数的时候,并不会对这句话产生疑问,但也许某天你会怀疑这个anywhere是否真实。有如下的代码:

<app-card>
  <ng-template #body>
    <app-component #component [input]="variable"></app-component>
  </ng-template>
  <ng-template #footer>
    {{component.input}}
  </ng-template>
</app-card>

当代码运行后,我们将会在控制台看到这样的错误提示:

TypeError: Cannot read property 'input' of undefined

为什么component会是undefined?

答案其实很明显,模板引用对象可以在模板中的任何地方使用,但此例中component的定义与使用却并不在一个template中。文档中所描述的 template 并不能直接与 组件的模板文件 划上等号。当我们使用ng-template时,会在当前模板的内部再建立一个新的模板,它的内部无法直接被外部模板触及,因此示例中的component.input自然会引起错误。

当 template 的定义明确以后,一切都是如此简单:模板引用变量存在作用域,其作用域是它所处的 template,而非它所在的模板文件,同时它可以在其作用域内的任何地方被使用。

最后,我们再看一个例子:

<div *ngIf="true">
  <app-component #component [input]="variable"></app-component>
</div>
{{component.input}}

当这段代码运行后,我们依旧会在控制台看到:

TypeError: Cannot read property 'input' of undefined

至于背后的原因,我便作为小小的悬念留给大家,由大家自己去了解。以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
javascript offsetX与layerX区别
Mar 12 Javascript
Js控制弹窗实现在任意分辨率下居中显示
Aug 01 Javascript
jQuery学习笔记之jQuery动画效果
Sep 09 Javascript
js获取日期:昨天今天和明天、后天
Jun 11 Javascript
原生JS实现轮播效果+学前端的感受(防止走火入魔)
Aug 21 Javascript
jquery实现全选、不选、反选的两种方法
Sep 06 Javascript
js带闹铃功能的倒计时代码
Sep 29 Javascript
JavaScript数组复制详解
Feb 02 Javascript
vue分类筛选filter方法简单实例
Mar 30 Javascript
最简单的JS实现json转csv的方法
Jan 10 Javascript
ES10的13个新特性示例(小结)
Sep 23 Javascript
JavaScript严格模式不支持八进制的问题讲解
Nov 07 Javascript
vue使用better-scroll实现下拉刷新、上拉加载
Nov 23 #Javascript
详解Vue2.0组件的继承与扩展
Nov 23 #Javascript
angular4自定义表单控件[(ngModel)]的实现
Nov 23 #Javascript
详解Angular中实现自定义组件的双向绑定的两种方法
Nov 23 #Javascript
Vue.js组件间通信方式总结【推荐】
Nov 23 #Javascript
vue-cli 2.*中导入公共less文件的方法步骤
Nov 22 #Javascript
vue全局使用axios的方法实例详解
Nov 22 #Javascript
You might like
建立文件交换功能的脚本(三)
2006/10/09 PHP
解析func_num_args与func_get_args函数的使用
2013/06/24 PHP
php为字符串前后添加指定数量字符的方法
2015/05/04 PHP
PHP开发中AJAX技术的简单应用
2015/12/11 PHP
php实现获取近几日、月时间示例
2019/07/06 PHP
火狐浏览器(firefox)下获得Event对象以及keyCode
2008/11/13 Javascript
DD_belatedPNG,IE6下PNG透明解决方案(国外)
2010/12/06 Javascript
Jquery插件 easyUI属性汇总
2011/01/19 Javascript
解读JavaScript代码 var ie = !-[1,] 最短的IE判定代码
2011/05/28 Javascript
js arguments对象应用介绍
2012/11/28 Javascript
jQuery中DOM操作实例分析
2015/01/23 Javascript
jQuery检测鼠标左键和右键点击的方法
2015/03/17 Javascript
实现无刷新联动例子汇总
2015/05/20 Javascript
js时钟翻牌效果实现代码分享
2020/07/31 Javascript
JS实现弹性菜单效果代码
2015/09/07 Javascript
js实现跨域的几种方法汇总(图片ping、JSONP和CORS)
2015/10/25 Javascript
纯JavaScript基于notie.js插件实现消息提示特效
2016/01/18 Javascript
Knockoutjs 学习系列(一)ko初体验
2016/06/07 Javascript
全面解析Node.js 8 重要功能和修复
2017/06/02 Javascript
Vue自定义过滤器格式化数字三位加一逗号实现代码
2018/03/23 Javascript
JavaScript求一组数的最小公倍数和最大公约数常用算法详解【面向对象,回归迭代和循环】
2018/05/07 Javascript
详解mpvue开发小程序小总结
2018/07/25 Javascript
从零学python系列之浅谈pickle模块封装和拆封数据对象的方法
2014/05/23 Python
Python使用MySQLdb for Python操作数据库教程
2014/10/11 Python
Python使用scrapy采集时伪装成HTTP/1.1的方法
2015/04/08 Python
Python自定义主从分布式架构实例分析
2016/09/19 Python
python虚拟环境迁移方法
2019/01/03 Python
python RC4加密操作示例【测试可用】
2019/09/26 Python
Python爬虫爬取Bilibili弹幕过程解析
2019/10/10 Python
芬兰攀岩、山地运动和户外活动用品购物网站:Bergfreunde
2016/10/06 全球购物
KEETSA环保床垫:更好的睡眠,更好的生活!
2016/11/24 全球购物
西班牙语在线票务市场:SuperBoletería
2019/06/10 全球购物
西安夏日科技有限公司Java笔试题
2013/01/11 面试题
反对四风自我剖析材料
2014/10/07 职场文书
环保证明
2015/06/23 职场文书
教你如何使用Python下载B站视频的详细教程
2021/04/29 Python