详解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 hasOwnProperty 方法 &amp; in 关键字
Nov 26 Javascript
jquery 可拖拽的窗体控件实现代码
Mar 21 Javascript
Three.js源码阅读笔记(光照部分)
Dec 27 Javascript
jcrop基本参数一览
Jul 16 Javascript
Ztree新增角色和编辑角色回显问题的解决
Oct 25 Javascript
jquery实现页面加载效果
Feb 21 Javascript
JavaScript中offsetWidth的bug及解决方法
May 17 Javascript
Vue2路由动画效果的实现代码
Jul 10 Javascript
Node.js  REPL (交互式解释器)实例详解
Aug 06 Javascript
在Node.js下运用MQTT协议实现即时通讯及离线推送的方法
Jan 24 Javascript
vue 导航内容设置选中状态样式的例子
Nov 01 Javascript
js实现时分秒倒计时
Dec 03 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 getsiteurl()函数
2009/09/05 PHP
php smarty模板引擎的6个小技巧
2014/04/24 PHP
php读取文件内容到数组的方法
2015/03/16 PHP
PHP创建文件,并向文件中写入数据,覆盖,追加的实现代码
2016/03/25 PHP
PHP实现通过URL提取根域名
2016/03/31 PHP
使用XHProf查找PHP性能瓶颈的实例
2017/12/13 PHP
DLL+ ActiveX控件+WEB页面调用例子
2010/08/07 Javascript
关于JQuery($.load)事件的用法和分析
2013/04/09 Javascript
jquery弹出关闭遮罩层实例
2013/08/06 Javascript
javascript根据像素点取位置示例
2014/01/27 Javascript
javascript数组去重方法终极总结
2014/06/05 Javascript
JQuery中extend的用法实例分析
2015/02/08 Javascript
jquery实现鼠标滑过小图查看大图的方法
2015/07/20 Javascript
jquery form表单获取内容以及绑定数据
2016/02/24 Javascript
js实现密码强度检测【附示例】
2016/03/30 Javascript
基于JS实现仿百度百家主页的轮播图效果
2017/03/06 Javascript
浅谈node中的cluster集群
2018/06/02 Javascript
微信小程序如何修改radio和checkbox的默认样式和图标
2019/07/24 Javascript
微信小程序wxml列表渲染原理解析
2019/11/27 Javascript
浅谈Python Opencv中gamma变换的使用详解
2018/04/02 Python
Mac下Anaconda的安装和使用教程
2018/11/29 Python
Python学习笔记之视频人脸检测识别实例教程
2019/03/06 Python
Python制作词云图代码实例
2019/09/09 Python
Pytorch中实现只导入部分模型参数的方式
2020/01/02 Python
tensorflow 自定义损失函数示例代码
2020/02/05 Python
详解Python中如何将数据存储为json格式的文件
2020/11/18 Python
使用html5新特性轻松监听任何App自带返回键的示例
2018/03/13 HTML / CSS
Lee牛仔裤澳大利亚官网:美国著名牛仔裤品牌
2017/09/02 全球购物
迷你分体式空调:SoGoodToBuy
2018/08/07 全球购物
天网工程实施方案
2014/03/26 职场文书
学习交流会主持词
2014/04/01 职场文书
绿色家庭事迹材料
2014/05/01 职场文书
爱心倡议书范文
2014/05/12 职场文书
销售会议开幕词
2015/01/28 职场文书
庆祝教师节主题班会
2015/08/17 职场文书
导游词之南昌滕王阁
2019/11/29 职场文书