詳解Angular模板引用變量及其作用域
Angular模板引用變量
如果你曾經(jīng)參與過(guò)Angular項(xiàng)目的開發(fā),那么你可能一眼就會(huì)看出誰(shuí)將是本文的主角:
<input type="text" [value]="value" #name>
若你對(duì)此陌生,也無(wú)須在意。示例代碼的<input>標(biāo)簽的屬性中存在一個(gè)畫風(fēng)明顯與其他屬性不同的家伙——#name,這種以一個(gè)#開頭命名,被附加在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組件的引用,而它具體是什么,則取決于它所依附的元素(不使用指令進(jìn)行干預(yù)時(shí))。如前文示例代碼中的模板引用變量name就是<input>這一DOM元素的引用。
既然模板引用變量是模板中某一元素的引用,那理所當(dāng)然地我們便可以通過(guò)這個(gè)引用變量" 觸及 "該模板元素的" 實(shí)體 "。這在實(shí)際地開發(fā)中是十分實(shí)用的,考慮以下代碼:
<app-component #component [input]="variable"></app-component>
{{ component.input }}
{{ component.func() }}
通過(guò)模板引用變量我們獲得了app-component組件的實(shí)例引用,這使得我們可以輕松地在模板中訪問(wèn)app-component組件內(nèi)部的成員。在某些情境下,這種能力給我們的開發(fā)提供了很大的助力。
模板引用變量的作用域
You can refer to a template reference variable anywhere in the template.
在文檔中,官方毫不含糊地向我們表示:模板引用變量可以在模板中的任何地方使用。最騷的是,“任何地方”還被特別加粗。我們?cè)诖蠖鄶?shù)的時(shí)候,并不會(huì)對(duì)這句話產(chǎn)生疑問(wèn),但也許某天你會(huì)懷疑這個(gè)anywhere是否真實(shí)。有如下的代碼:
<app-card>
<ng-template #body>
<app-component #component [input]="variable"></app-component>
</ng-template>
<ng-template #footer>
{{component.input}}
</ng-template>
</app-card>
當(dāng)代碼運(yùn)行后,我們將會(huì)在控制臺(tái)看到這樣的錯(cuò)誤提示:
TypeError: Cannot read property 'input' of undefined
為什么component會(huì)是undefined?
答案其實(shí)很明顯,模板引用對(duì)象可以在模板中的任何地方使用,但此例中component的定義與使用卻并不在一個(gè)template中。文檔中所描述的 template 并不能直接與 組件的模板文件 劃上等號(hào)。當(dāng)我們使用ng-template時(shí),會(huì)在當(dāng)前模板的內(nèi)部再建立一個(gè)新的模板,它的內(nèi)部無(wú)法直接被外部模板觸及,因此示例中的component.input自然會(huì)引起錯(cuò)誤。
當(dāng) template 的定義明確以后,一切都是如此簡(jiǎn)單:模板引用變量存在作用域,其作用域是它所處的 template,而非它所在的模板文件,同時(shí)它可以在其作用域內(nèi)的任何地方被使用。
最后,我們?cè)倏匆粋€(gè)例子:
<div *ngIf="true">
<app-component #component [input]="variable"></app-component>
</div>
{{component.input}}
當(dāng)這段代碼運(yùn)行后,我們依舊會(huì)在控制臺(tái)看到:
TypeError: Cannot read property 'input' of undefined
至于背后的原因,我便作為小小的懸念留給大家,由大家自己去了解。以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
AngularJS使用angular-formly進(jìn)行表單驗(yàn)證
這篇文章主要介紹了AngularJS使用angular-formly進(jìn)行表單驗(yàn)證的相關(guān)資料,需要的朋友可以參考下2015-12-12
詳解AngularJS實(shí)現(xiàn)表單驗(yàn)證
這篇文章主要介紹了AngularJS實(shí)現(xiàn)表單驗(yàn)證,客戶端表單驗(yàn)證是AngularJS里面最酷的功能之一。AngularJS表單驗(yàn)證可以讓你從一開始就寫出一個(gè)具有交互性和可相應(yīng)的現(xiàn)代HTML5表單,對(duì)AngularJS表單驗(yàn)證感興趣的小伙伴們可以參考一下2015-12-12
AngularJs 最新驗(yàn)證手機(jī)號(hào)碼的實(shí)例,成功測(cè)試通過(guò)
下面小編就為大家分享一篇AngularJs 最新驗(yàn)證手機(jī)號(hào)碼的實(shí)例,成功測(cè)試通過(guò),具有很好的參考價(jià)值。希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2017-11-11
Angular2學(xué)習(xí)教程之組件中的DOM操作詳解
這篇文章主要給大家介紹了Angular2學(xué)習(xí)教程之組件中DOM操作的相關(guān)資料,文中介紹的非常詳細(xì),對(duì)大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面跟著小編一起來(lái)看看吧。2017-05-05
詳談Angular 2+ 的表單(一)之模板驅(qū)動(dòng)型表單
這篇文章主要介紹了Angular 2+ 的表單(一)之模板驅(qū)動(dòng)型表單,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2017-04-04
詳解Angular2表單-模板驅(qū)動(dòng)的表單(Template-Driven Forms)
本篇文章主要介紹了詳解Angular2表單-模板驅(qū)動(dòng)的表單(Template-Driven Forms),具有一定的參考價(jià)值,有興趣的可以了解一下2017-08-08
Angular.js中$resource高大上的數(shù)據(jù)交互詳解
這篇文章主要給大家介紹了關(guān)于Angular.js中$resource高大上的數(shù)據(jù)交互的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用angular.js具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面跟著小編來(lái)一起看看吧。2017-07-07
AngularJS基礎(chǔ) ng-init 指令簡(jiǎn)單示例
本文主要介紹AngularJS ng-init 指令,這里幫大家整理了關(guān)于ng-init 指令的基本知識(shí)資料,并附有簡(jiǎn)單的代碼示例,有需要學(xué)習(xí)的小伙伴可以參考下2016-08-08
AngularJS 在同一個(gè)界面啟動(dòng)多個(gè)ng-app應(yīng)用模塊詳解
這篇文章主要介紹了AngularJS 在同一個(gè)界面啟動(dòng)多個(gè)ng-app應(yīng)用模塊詳解的相關(guān)資料,需要的朋友可以參考下2016-12-12

