中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Angular中NgTemplateOutlet指令的理解和用法是什么

發布時間:2021-10-19 10:38:47 來源:億速云 閱讀:273 作者:柒染 欄目:web開發

這期內容當中小編將會給大家帶來有關Angular中NgTemplateOutlet指令的理解和用法是什么,文章內容豐富且以專業的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

最近在看一個培訓項目的時候有看到這個NgTemplateOutlet這個結構性指令,但是我之前沒接觸過,不知道這東西是怎么用的,然后,我去官網上去搜了一下這個api(官網鏈接點這里)。

只是說一下NgTemplateOutlet的用法和使用場景。

使用方法

這個api按照官網的說法是這樣的:

根據一個提前備好的 TemplateRef 插入一個內嵌視圖。

我給它翻譯一下:使NgTemplateOutlet的宿主元素變成一個內嵌視圖——這個內嵌視圖是根據一個提前定義好的templateRef模板引用生成的。而宿主元素無論是什么元素,都不會被渲染出來。

我們將官網的示例改一下(因為官網的人命我看不懂):

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

    <ng-template #one><span>Hello</span></ng-template>
    <ng-template #two let-name><span>Hello {{name}}!</span></ng-template>
    <ng-template #three let-person="lastName">My name is <span>LeBron {{person}}!</span></ng-template>
`
})
export class NgTemplateOutletExample {
  myContext = {$implicit: 'World', lastName: 'James'};
}

一個宿主元素可以使用ngTemplateOutlet這個結構性指令,使自己變成任意的一個<ng-template>模板生成的內嵌視圖。并且可以給其設置上下文對象。然后我們在這個模板中可以使用let-變量這個模板輸入變量來獲取上下文對象中的值,這個模板更具靈活性。

應用場景

類似于ng-zorro這個框架的分頁組件Pagination(官網鏈接)。如果我們對默認上一頁和下一頁的樣式或者結構不滿意,想要自己調整的話,我們可以提供一個輸入屬性(@Input定義的屬性),來接收一個模板,并且為其提供所必須的屬性或者方法。這樣的話,我們就可以在不修改組件源碼的情況下實現組件的復用。

Demo

我們先定義一個子組件HeroDisplayCard,角色的展示界面

@Component({
  selector:'app-hero-display-card',
  template:`
    <h3 [style]="{textAlign:'center'}">角色列表</h3>
    <ul class="hero-card-box">
      <li class="hero-card-item" *ngFor="let h of heroesList">
        <p [style]="{textAlign:'center'}">
          角色id:{{h.id}}--
          角色名字:{{h.name}}--
          角色屬性:{{h.features}}
        </p>
      </li>
    </ul>
  `,
  styles:[
    `.hero-card-box{
      width: 600px;
      margin: 10px auto;
    }
    .hero-card-item{
      list-style: none;
    }
    `
  ]
})
export class HeroDisplayCard {
  public heroesList = [
    {id:'013',name:'鐘離',features:'rock'},
    {id:'061',name:'煙緋',features:'fire'},
    {id:'022',name:'迪奧娜',features:'ice'},
    {id:'004',name:'諾艾爾',features:'rock'},
  ]
}

然后將這個組件引入一個父組件當中:

@Component({
  selector:'app-templateoutlet-app-demo',
  template:`
    <app-hero-display-card></app-hero-display-card>
  `
})
export class TemplateOutletAppDemoComponent {}

代碼運行一下,效果如圖:

Angular中NgTemplateOutlet指令的理解和用法是什么

我覺得這個li的樣式實在是太丑了,而且順序也不太對。我希望把角色屬性調到角色名字之前。這樣的話,如果只是單純的通過輸入屬性來更改樣式的話就會變得很麻煩,我們可能需要定義非常多的變量來供使用者選擇,這樣的話有點得不償失。那么我們何不直接提供一個模板給使用者,我們只需要提供必要的數據就可以了。樣式,排版這些自由交給使用者。

那么對于子組件HeroDisplayCard我們可以這么改:

@Component({
  selector:'app-hero-display-card',
  template:`
    <h3 [style]="{textAlign:'center'}">角色列表</h3>
    <ul class="hero-card-box">
      <ng-container *ngFor="let h of heroesList">
        <!-- 如果沒有傳入cardItemTemplate則顯示默認 -->
        <li class="hero-card-item" *ngIf="!cardItemTemplate">
          <p [style]="{textAlign:'center'}">
            角色id:{{h.id}}--
            角色名字:{{h.name}}--
            角色屬性:{{h.features}}
          </p>
        </li>
        <!-- 如果傳入了自定義模板,則顯示出來,鑒于angular的結構型指令不能在同一個宿主元素上的規定,于是這樣寫 -->
        <ng-container *ngIf="cardItemTemplate">
		  <!-- 將自定義模板的上下文對象設置為h -->
          <ng-container *ngTemplateOutlet="cardItemTemplate;context:h"></ng-container>
        </ng-container>
      </ng-container>
    </ul>
  `,
  styles:[ //省略 ]
})
export class HeroDisplayCard {
  @Input() cardItemTemplate:TemplateRef<any>;
  public heroesList = [ // 省略]
}

然后我們在父組件中將自定義的模板傳入進去:

@Component({
  selector:'app-templateoutlet-app-demo',
  template:`
    <app-hero-display-card [cardItemTemplate]="myCardTemplate"></app-hero-display-card>
	<!-- 將模板引用變量myCardTemplate傳入子組件 -->
    <ng-template #myCardTemplate let-id="id" let-name="name" let-features="features">
      <li class="hero-card-custom-item">
        <p>角色id:<span>{{id}}</span></p>
        <p>角色屬性:<span>{{features}}</span></p>
        <p>角色名字:<span>{{name}}</span></p>
      </li>
    </ng-template>
  `,
  styles:[
    //在這里寫自定義模板的樣式  
    `.hero-card-custom-item{
      width: 100%;
      height: 35px;
      border: 1px solid #999999;
      border-radius: 5px;
      display: flex;
      justify-content:space-around;
      align-items: center;
      margin: 10px 0;
    }
    .hero-card-custom-item p {
      width: 30%;
      margin: 0;
      font-size: 20px;
      color: #666666;
    }
    .hero-card-custom-item p span {
      color: red;
    }`
  ]
})
export class TemplateOutletAppDemoComponent {}

然后運行一下,效果如圖(其實還是很丑):

Angular中NgTemplateOutlet指令的理解和用法是什么

總結

使用NgTemplateOutlet這個結構性指令可以增強我們子組件的封裝程度,避免需要定義大量的輸入屬性,導致父組件的模板看起來臃腫不堪。

上述就是小編為大家分享的Angular中NgTemplateOutlet指令的理解和用法是什么了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

瑞金市| 兰溪市| 永修县| 福建省| 炎陵县| 宿松县| 吴桥县| 安塞县| 咸宁市| 于都县| 台南市| 大田县| 玛曲县| 井冈山市| 西乡县| 昆山市| 定结县| 北票市| 台前县| 东安县| 通城县| 普宁市| 桂林市| 大新县| 绵阳市| 孝昌县| 长汀县| 泌阳县| 太仓市| 汉沽区| 比如县| 北海市| 靖宇县| 西藏| 芦山县| 平阳县| 沙雅县| 巢湖市| 乌苏市| 颍上县| 曲阜市|