详解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 框架小结 个人工作经验
Jun 13 Javascript
js 鼠标移动显示图片的简单实例
Dec 25 Javascript
Jquery EasyUI Datagrid右键菜单实现方法
Dec 30 Javascript
使用jQuery和ajax代替iframe的方法(详解)
Apr 12 jQuery
js中字符型和数值型数字的互相转化方法(必看)
Apr 25 Javascript
详细AngularJs4的图片剪裁组件的实例
Jul 12 Javascript
jQuery实现简单的下拉菜单导航功能示例
Dec 07 jQuery
Angular 4.x+Ionic3踩坑之Ionic3.x pop反向传值详解
Mar 13 Javascript
react router4+redux实现路由权限控制的方法
May 03 Javascript
修改npm全局安装模式的路径方法
May 15 Javascript
RequireJS用法简单示例
Aug 20 Javascript
layer扩展打开/关闭动画的方法
Sep 23 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
ip签名探针
2006/10/09 PHP
php 向访客和爬虫显示不同的内容
2009/11/09 PHP
探讨:使用XMLSerialize 序列化与反序列化
2013/06/08 PHP
探讨:如何通过stats命令分析Memcached的内部状态
2013/06/14 PHP
利用中国天气预报接口实现简单天气预报
2014/01/20 PHP
PHP 计算两个特别大的整数实例代码
2018/05/07 PHP
Thinkphp页面跳转设置跳转等待时间的操作
2019/10/16 PHP
PHP实现创建一个RPC服务操作示例
2020/02/23 PHP
Javascript 文件夹选择框的两种解决方案
2009/07/01 Javascript
JQuery从头学起第三讲
2010/07/06 Javascript
关于js datetime的那点事
2011/11/15 Javascript
jQuery实现3D文字特效的方法
2015/03/10 Javascript
JS返回iframe中frameBorder属性值的方法
2015/04/01 Javascript
javascript比较两个日期相差天数的方法
2015/07/23 Javascript
jquery+css实现动感的图片切换效果
2015/11/25 Javascript
js使用html2canvas实现屏幕截取的示例代码
2017/08/28 Javascript
详解angularjs实现echart图表效果最简洁教程
2017/11/29 Javascript
微信小程序canvas实现刮刮乐效果
2018/07/09 Javascript
详解auto-vue-file:一个自动创建vue组件的包
2019/04/26 Javascript
javascript for循环性能测试示例
2019/08/07 Javascript
Python yield 使用浅析
2015/05/28 Python
Python入门之三角函数全解【收藏】
2017/11/08 Python
详解用TensorFlow实现逻辑回归算法
2018/05/02 Python
Python定时从Mysql提取数据存入Redis的实现
2020/05/03 Python
python属于软件吗
2020/06/18 Python
python利用xlsxwriter模块 操作 Excel
2020/10/14 Python
python中绕过反爬虫的方法总结
2020/11/25 Python
Python截图并保存的具体实例
2021/01/14 Python
在html5的Canvas上绘制椭圆的几种方法总结
2013/01/07 HTML / CSS
百思买美国官网:Best Buy
2016/07/28 全球购物
《小小雨点》教学反思
2014/02/18 职场文书
2014年敬老院工作总结
2014/12/08 职场文书
2015年全国爱眼日活动方案
2015/05/05 职场文书
go语言中fallthrough的用法说明
2021/05/06 Golang
Python使用华为API为图像设置多个锚点标签
2022/04/12 Python
Linux中一对多配置日志服务器的详细步骤
2022/07/23 Servers