详解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 相关文章推荐
How to Auto Include a Javascript File
Feb 02 Javascript
初探jquery——表单应用范例
Feb 20 Javascript
js调试工具 Javascript Debug Toolkit 2.0.0版本发布
Dec 02 Javascript
jQuery select操作控制方法小结
May 26 Javascript
关于js日期转化为毫秒数“节省20%的效率和和节省9个字符“问题
Mar 01 Javascript
jquery实现显示已选用户
Jul 21 Javascript
js实现兼容PC端和移动端滑块拖动选择数字效果
Feb 16 Javascript
vue-cli3.0+element-ui上传组件el-upload的使用
Dec 03 Javascript
详细分析Node.js 多进程
Jun 22 Javascript
微信小程序实现点击页面出现文字
Sep 21 Javascript
Javascript柯里化实现原理及作用解析
Oct 22 Javascript
vue前端工程的搭建
Mar 31 Vue.js
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
三国漫画《火凤燎原》宣布动画化PV放出 预计2020年播出
2020/03/08 国漫
PHP编程中字符串处理的5个技巧小结
2007/11/13 PHP
深入PHP magic quotes的详解
2013/06/17 PHP
使用JavaScript switch case 另类写法
2010/03/14 Javascript
跟着Jquery API学Jquery之一 选择器
2010/04/07 Javascript
Jquery Change与bind事件代码
2011/09/29 Javascript
js判断是否为数组的函数: isArray()
2011/10/30 Javascript
jquery怎样实现ajax联动框(一)
2013/03/08 Javascript
jquery插件jTimer(jquery定时器)使用方法
2013/12/23 Javascript
javascript调试之DOM断点调试法使用技巧分享
2014/04/15 Javascript
JavaScript lastIndexOf方法入门实例(计算指定字符在字符串中最后一次出现的位置)
2014/10/17 Javascript
JQuery中DOM加载与事件执行实例分析
2015/06/13 Javascript
Js获取当前日期时间及格式化代码
2016/09/17 Javascript
解决OneThink中无法异步提交kindeditor文本框中修改后的内容方法
2017/05/05 Javascript
JS检测是否可以访问公网服务器功能代码
2017/06/19 Javascript
javascript帧动画(实例讲解)
2017/09/02 Javascript
ElementUI多个子组件表单的校验管理实现
2019/11/07 Javascript
python双向链表实现实例代码
2013/11/21 Python
Python 列表list使用介绍
2014/11/30 Python
python 实现一个贴吧图片爬虫的示例
2017/10/12 Python
python实现类之间的方法互相调用
2018/04/29 Python
python3对接mysql数据库实例详解
2019/04/30 Python
将Pytorch模型从CPU转换成GPU的实现方法
2019/08/19 Python
Django-xadmin+rule对象级权限的实现方式
2020/03/30 Python
python属于解释语言吗
2020/06/11 Python
Python venv虚拟环境配置过程解析
2020/07/08 Python
Python 在局部变量域中执行代码
2020/08/07 Python
Volcom英国官方商店:美国殿堂级滑板、冲浪、滑雪服装品牌
2019/03/13 全球购物
女性时尚网购:Chic Me
2019/07/30 全球购物
会计毕业生自荐信
2013/11/21 职场文书
考试不及格检讨书
2014/01/09 职场文书
市政施工员自我鉴定
2014/01/15 职场文书
创建文明学校实施方案
2014/03/11 职场文书
反对邪教标语
2014/06/30 职场文书
jQuery class属性操作addClass()与removeClass()、hasClass()、toggleClass()
2021/03/31 jQuery
SpringBoot全局异常处理方案分享
2022/05/25 Java/Android