详解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 相关文章推荐
jQuery extend 的简单实例
Sep 18 Javascript
js脚本获取webform服务器控件的方法
May 16 Javascript
gridview生成时如何去掉style属性中的border-collapse
Sep 30 Javascript
jQuery中has()方法用法实例
Jan 06 Javascript
jQuery遍历页面所有CheckBox查看是否被选中的方法
Apr 14 Javascript
Node.js实现Excel转JSON
Apr 24 Javascript
js实现人民币大写金额形式转换
Apr 27 Javascript
javascript函数的四种调用模式
Jan 08 Javascript
javascript 中的继承实例详解
May 05 Javascript
angularJs中json数据转换与本地存储的实例
Oct 08 Javascript
详解JS预解析原理
Jun 16 Javascript
Javascript表单序列化原理及实现代码详解
Oct 30 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
收音机的保养
2021/03/01 无线电
Windows下的PHP5.0详解
2006/11/18 PHP
JAVASCRIPT IE 与 FF中兼容问题小结
2009/02/18 Javascript
jQuery 设置 CSS 属性示例介绍
2014/01/16 Javascript
JavaScript避免内存泄露及内存管理技巧
2014/09/05 Javascript
jquery实现两个图片渐变切换效果的方法
2015/06/25 Javascript
如何用jQuery实现ASP.NET GridView折叠伸展效果
2015/09/26 Javascript
概述VUE2.0不可忽视的很多变化
2016/09/25 Javascript
Vue.js 2.0 移动端拍照压缩图片上传预览功能
2017/03/06 Javascript
vue-cli 自定义指令directive 添加验证滑块示例
2017/10/19 Javascript
web前端vue之CSS过渡效果示例
2018/01/10 Javascript
jQuery+Cookie实现切换皮肤功能【附源码下载】
2018/03/25 jQuery
Vue利用canvas实现移动端手写板的方法
2018/05/03 Javascript
使用vue点击li,获取当前点击li父辈元素的属性值方法
2018/09/12 Javascript
详解js访问对象的属性和方法
2018/10/25 Javascript
Js 利用正则表达式和replace函数获取string中所有被匹配到的文本(推荐)
2018/10/28 Javascript
js函数柯里化的方法和作用实例分析
2020/04/11 Javascript
Python格式化压缩后的JS文件的方法
2015/03/05 Python
Python的Django框架可适配的各种数据库介绍
2015/07/15 Python
浅谈python socket函数中,send与sendall的区别与使用方法
2017/05/09 Python
python下载文件记录黑名单的实现代码
2017/10/24 Python
numpy使用技巧之数组过滤实例代码
2018/02/03 Python
Python smtplib实现发送邮件功能
2018/05/22 Python
Python django框架应用中实现获取访问者ip地址示例
2019/05/17 Python
Django如何实现上传图片功能
2019/08/16 Python
pytorch 输出中间层特征的实例
2019/08/17 Python
Python3 socket即时通讯脚本实现代码实例(threading多线程)
2020/06/01 Python
python3.9实现pyinstaller打包python文件成exe
2020/12/13 Python
使用CSS3中的calc()属性来以算式表达尺寸数值
2016/06/06 HTML / CSS
数控技术应届生求职信
2013/11/13 职场文书
2014党员民主评议个人思想剖析发言
2014/09/19 职场文书
稽核岗位职责范本
2015/04/13 职场文书
物资采购管理制度
2015/08/06 职场文书
2019旅游导游工作总结
2019/06/27 职场文书
SpringBoot生成License的实现示例
2021/06/16 Java/Android
Java 超详细讲解hashCode方法
2022/04/07 Java/Android