详解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 相关文章推荐
js获取 type=radio 值的方法
May 09 Javascript
jquery选择器需要注意的问题
Nov 26 Javascript
js采用concat和sort将N个数组拼接起来的方法
Jan 21 Javascript
javascript函数命名的三种方式及区别介绍
Mar 22 Javascript
jQuery EasyUI学习教程之datagrid点击列表头排序
Jul 09 Javascript
Jquery表单验证失败后不提交的解决方法
Oct 18 Javascript
bootstrap选项卡使用方法解析
Jan 11 Javascript
深入理解Vue.js源码之事件机制
Sep 27 Javascript
Js利用prototype自定义数组方法示例
Oct 20 Javascript
利用Dectorator分模块存储Vuex状态的实现
Feb 05 Javascript
Javascript删除数组里的某个元素
Feb 28 Javascript
Vue使用Three.js加载glTF模型的方法详解
Jun 14 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
PHP一些常用的正则表达式字符的一些转换
2008/07/29 PHP
在PHP上显示JFreechart画的统计图方法
2013/11/03 PHP
PHP封装的mysqli数据库操作类示例
2019/02/16 PHP
解决在laravel中auth建立时候遇到的问题
2019/10/15 PHP
ExtJs扩展之GroupPropertyGrid代码
2010/03/05 Javascript
style、 currentStyle、 runtimeStyle区别分析
2010/08/01 Javascript
jquery的Theme和Theme Switcher使用小结
2010/09/08 Javascript
js 判断上传文件大小及格式代码
2013/11/13 Javascript
js+div实现图片滚动效果代码
2014/02/10 Javascript
使用jQuery实现图片遮罩半透明坠落遮挡
2015/03/16 Javascript
js+html5通过canvas指定开始和结束点绘制线条的方法
2015/06/05 Javascript
jquery中live()方法和bind()方法区别分析
2016/06/23 Javascript
Bootstrap弹出带合法性检查的登录框实例代码【推荐】
2016/06/23 Javascript
Javascript实现图片懒加载插件的方法
2016/10/20 Javascript
easyui-edatagrid.js实现回车键结束编辑功能的实例
2017/04/12 Javascript
使用vue制作FullPage页面滚动效果
2017/08/21 Javascript
vue-cli 引入jQuery,Bootstrap,popper的方法
2018/09/03 jQuery
Python实现的生成自我描述脚本分享(很有意思的程序)
2014/07/18 Python
如何在python中使用selenium的示例
2017/12/26 Python
浅谈pyqt5中信号与槽的认识
2019/02/17 Python
TensorFlow卷积神经网络之使用训练好的模型识别猫狗图片
2019/03/14 Python
Flask使用Pyecharts在单个页面展示多个图表的方法
2019/08/05 Python
python爬虫之遍历单个域名
2019/11/20 Python
解决pyPdf和pyPdf2在合并pdf时出现异常的问题
2020/04/03 Python
Python并发爬虫常用实现方法解析
2020/11/19 Python
利用Opencv实现图片的油画特效实例
2021/02/28 Python
英国最大的电子零件及配件零售商:Partmaster
2017/04/24 全球购物
意大利中国电子产品购物网站:Geekmall.com
2019/09/30 全球购物
swtich是否能作用在byte上,是否能作用在long上,是否能作用在String上
2013/07/06 面试题
运动会方阵解说词
2014/02/12 职场文书
学校教师安全责任书
2014/07/23 职场文书
党员群众路线学习心得体会
2014/11/04 职场文书
警告通知
2015/04/25 职场文书
金砖之国观后感
2015/06/11 职场文书
初中运动会前导词
2015/07/20 职场文书
详解CSS不受控制的position fixed
2021/05/25 HTML / CSS