最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Angular 向組件傳遞模板的兩種方法

 更新時間:2018年02月23日 08:13:51   作者:不如隱茶去  
這篇文章主要介紹了Angular 向組件傳遞模板的兩種方法,第一種方式<ng-content>第二種方式是NgTemplateOutlet 指令及各種使用方式介紹,需要的朋友可以參考下

最近在寫一個日期選擇器組件,為了滿足將來可能出現(xiàn)的各種需求,所以需要能夠高度的自定義組件的樣式。為了達到這個目的,需要能夠在日期選擇器組件外控制每個日期格子內(nèi)要顯示的內(nèi)容,比如,標(biāo)上節(jié)假日之類的。這時候,組件的一部分模板就需要由調(diào)用方提供。

在 React 里面,這種需求挺簡單的,只要實現(xiàn)一個 date => Element 這樣的函數(shù)就好了,但是 Angular 模板是純粹的模板,需要使用一些專門的概念才能實現(xiàn)這個功能。

第一種方式 <ng-content>

<ng-content> 這個標(biāo)簽到本文撰寫時為止,還沒有官方的文檔,甚至連占位符都沒有。但是這并不妨礙我們的使用,外國熱心網(wǎng)友已經(jīng)總結(jié)出了 <ng-content> 在現(xiàn)階段的特點與作用。

基本用法

<!-- Wrapper.Component.html -->
<div>
  hello
  <ng-content></ng-content>
</div>

假設(shè)我們有一個上述的組件,然后向下面這樣調(diào)用:

<wrapper>
  <span> World </span>
</wrapper>

那么最終的渲染結(jié)果將會是這樣的:

<div>
  hello
  <span> World </span>
</div>

看起來就是發(fā)生了很簡單的替換,但是如果在 Wrapper 中出現(xiàn)了多個 <ng-content> 會出現(xiàn)多個 <span> World </span> 嗎?答案是不會的。<ng-content> 的本質(zhì)只是移動元素,并不會去自動的創(chuàng)建傳入的模板,所以就算用 ngFor 套住 <ng-content> 也不會出現(xiàn)很多個 <span> World </span>。如果傳入的是自定義的組件,這些組件也只會被實例化一次。

進階用法

當(dāng)然,如果 <ng-content> 的功能僅僅只是這樣就顯得太雞肋了,在使用 <ng-content> 的時候可以指定一個選擇器,這個選擇器可以捕獲相符的直接子元素。例如:

<!-- Wrapper.Component.html -->
<div>
  hello
  <ng-content></ng-content>
  <hr/>
  <ng-content select="span"></ng-content>
</div>

然后像下面這樣使用:

<wrapper>
  <span> World </span>
  2333
</wrapper>

最終的渲染結(jié)果將會是這樣:

<div>
  hello
  2333
  <hr/>
  <span> World </span>
</div>

除了設(shè)置 ng-content 標(biāo)簽的 select 屬性之外,還可以在子元素上使用 ngProjectAs 屬性,這個屬性可以讓這個元素被父元素中指定的 ng-content 所捕獲。舉個例子:

<wrapper>
  <div ngProjectAs="span"> World </div>
  2333
</wrapper>

這次被傳入的模板變成了一個 div,但是因為設(shè)置了 ngProjectAs,所以“World”會出現(xiàn)在分割線下方。

第二種方式 NgTemplateOutlet 指令

使用 ng-content 確實可以起到傳入模板的效果,但是卻有個很致命的問題,就是無法傳遞數(shù)據(jù)到傳入的模板中。為了將數(shù)據(jù)傳遞到傳入的模板中,就需要使用到 NgTemplateOutlet 指令。

基本使用

這個指令可以用來在模板的指定位置實例化一個 TemplateRef 對象,同時,在實例化的過程中還可以傳入一個數(shù)據(jù)對象。而 TemplateRef 可以通過 ng-template 標(biāo)簽來創(chuàng)建,舉個例子:

@Component({
 selector: 'ng-template-outlet-example',
 template: `
  <ng-container *ngTemplateOutlet="name; context: myContext"></ng-container>

  <ng-template #name let-name="data"><span>Hello {{name}}!</span></ng-template>
`
})
class NgTemplateOutletExample {
 myContext = {data: 'World'};
}

ng-container 是一個虛擬的元素,在這個元素上我們使用了一個 NgTemplateOutlet 指令,指定了要實例化下面的名為 name 的 ng-template。同時把 myContext 這個對象作為實例化的數(shù)據(jù)上下文傳入,所以最終就會顯示 “Hello World!”。值得注意的是在 ng-template 里面獲取傳輸?shù)臄?shù)據(jù)上下文的方式:let-variableName='key'

進階使用

接下來就要實現(xiàn)本文開頭提到的需求了,在組件外部傳入模板。還是以上面的例子為例,因為模板需要由外界作為子內(nèi)容傳入,所以需要我們手動來捕獲模板,這里需要就需要使用 ContentChild:

@Component({
 selector: 'wrapper',
 template: `
  <ng-container *ngTemplateOutlet="name; context: myContext"></ng-container>
`
})
class NgTemplateOutletExample {
 @ContentChild(TemplateRef) name: TemplateRef<any>;
 myContext = {data: 'World'};
}

就是這么簡單的改動就可以讓我們的組件從外界接受模板了,來試一試:

<wrapper>
  <ng-template let-value="data">
    <span>Hello {{value}}!</span>
  </ng-template>
</wrapper>

總結(jié)

以上就是 Angular 中向組件傳遞模板的兩種方法,其中,使用 <ng-content> 標(biāo)簽可以更方便的控制傳入的模板在 DOM 中的位置,而 NgTemplateOutlet 可以向傳入的模板傳遞渲染數(shù)據(jù),兩者搭配使用可以起到很好的效果。

以上所述是小編給大家介紹的Angular 向組件傳遞模板的兩種方法,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!

相關(guān)文章

  • angularJs 表格添加刪除修改查詢方法

    angularJs 表格添加刪除修改查詢方法

    下面小編就為大家分享一篇angularJs 表格添加刪除修改查詢方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-02-02
  • AngularJS表格詳解及示例代碼

    AngularJS表格詳解及示例代碼

    本文主要講解AngularJS表格的知識內(nèi)容,這里整理了基礎(chǔ)資料,并附代碼和示例效果圖,有興趣的小伙伴可以參考下
    2016-08-08
  • python爬取安居客二手房網(wǎng)站數(shù)據(jù)(實例講解)

    python爬取安居客二手房網(wǎng)站數(shù)據(jù)(實例講解)

    下面小編就為大家?guī)硪黄猵ython爬取安居客二手房網(wǎng)站數(shù)據(jù)(實例講解)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-10-10
  • 給angular加上動畫效遇到的問題總結(jié)

    給angular加上動畫效遇到的問題總結(jié)

    本文給大家總結(jié)了一下在angular中給ng-repeat列表加上動畫效果時所遇到的問題及解決方法,推薦給大家,希望大家能夠喜歡。
    2016-02-02
  • Angular.js實現(xiàn)獲取驗證碼倒計時60秒按鈕的簡單方法

    Angular.js實現(xiàn)獲取驗證碼倒計時60秒按鈕的簡單方法

    最近做項目的時候又遇到了驗證碼倒計時的需求,發(fā)現(xiàn)這個功能還是挺實用的,所以就想著總結(jié)一下,下面這篇文章主要給大家介紹了關(guān)于利用Angular.js如何實現(xiàn)獲取驗證碼倒計時按鈕的簡單方法,需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-10-10
  • 詳解什么是@ngrx/store開發(fā)包中的MemoizedSelector

    詳解什么是@ngrx/store開發(fā)包中的MemoizedSelector

    這篇文章主要為大家介紹了@ngrx/store開發(fā)包中的MemoizedSelector使用分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-07-07
  • AngularJS實踐之使用NgModelController進行數(shù)據(jù)綁定

    AngularJS實踐之使用NgModelController進行數(shù)據(jù)綁定

    大家都知道AngularJS中的指令是其尤為復(fù)雜的一個部分,但是這也是其比較好玩的地方。這篇文章我們就來說一說如何在我們自定義的指令中,利用ngModel的controller來做雙向數(shù)據(jù)綁定,本文對大家學(xué)習(xí)AngularJS具有一定的參考借鑒價值,有需要的朋友們可以參考借鑒。
    2016-10-10
  • AngularJS路由實現(xiàn)頁面跳轉(zhuǎn)實例

    AngularJS路由實現(xiàn)頁面跳轉(zhuǎn)實例

    這篇文章主要為大家詳細介紹了AngularJS路由實現(xiàn)頁面跳轉(zhuǎn)的實例,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-03-03
  • AngularJS中使用HTML5手機攝像頭拍照

    AngularJS中使用HTML5手機攝像頭拍照

    這篇文章主要介紹了AngularJS中使用HTML5手機攝像頭拍照的相關(guān)資料,需要的朋友可以參考下
    2016-02-02
  • 詳解AngularJS中$http緩存以及處理多個$http請求的方法

    詳解AngularJS中$http緩存以及處理多個$http請求的方法

    $http 是 AngularJS 中的一個核心服務(wù),用于讀取遠程服務(wù)器的數(shù)據(jù),通過本文給大家介紹AngularJS中$http緩存以及處理多個$http請求的方法,希望的朋友一起學(xué)習(xí)吧
    2016-02-02

最新評論

汉沽区| 青海省| 昔阳县| 招远市| 聂荣县| 昌宁县| 英德市| 嘉兴市| 榆中县| 汉中市| 宁津县| 深州市| 汶川县| 澄迈县| 正宁县| 牡丹江市| 衡水市| 无为县| 名山县| 吉隆县| 和政县| 三台县| 敦煌市| 荔波县| 扶风县| 德令哈市| 红桥区| 都江堰市| 桑植县| 济阳县| 寿光市| 凤山市| 当雄县| 什邡市| 临汾市| 淮阳县| 崇礼县| 南丹县| 正阳县| 山阳县| 隆德县|