目錄
使用方法
應用程式場景
Demo
角色列表
#總結
首頁 web前端 js教程 聊聊Angular中NgTemplateOutlet指令的理解和用法

聊聊Angular中NgTemplateOutlet指令的理解和用法

Oct 19, 2021 am 10:14 AM
angular

本篇文章帶大家來了解Angular中NgTemplateOutlet指令,介紹NgTemplateOutlet這個結構性指令的理解與應用,希望對大家有幫助!

聊聊Angular中NgTemplateOutlet指令的理解和用法

最近在看一個訓練專案的時候有看到這個NgTemplateOutlet這個結構性指令,但是我之前沒接觸過,不知道這東西是怎麼用的,然後,我去官網上去搜了一下這個api(官網連結點這裡)。

但是它的這個api說明我看不懂,不知道這個什麼所謂的上下文物件是啥,也不知道這個let變數又是啥。然後經過我一整天的翻文檔,記筆記,終於搞明白了這是什麼東西了,沒有搞明白的小伙伴可以參考一下我的上一篇文章:【Angular學習】關於模板輸入變量(let-變數)的理解

這篇文章就只是說一下NgTemplateOutlet的用法和使用場景。 【相關教學推薦:《angular教學》】

使用方法

這個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: &#39;World&#39;, lastName: &#39;James&#39;};
}
登入後複製

一個宿主元素可以使用ngTemplateOutlet這個結構性指令,使自己變成任意的一個<ng-template>模板產生的內嵌視圖。並且可以給其設定上下文物件。然後我們在這個模板中可以使用let-變數這個模板輸入變數來取得上下文物件中的值,這個模板更有彈性。

應用程式場景

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

Demo

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

@Component({
  selector:&#39;app-hero-display-card&#39;,
  template:`
    <h2 id="角色列表">角色列表</h2>
    <ul class="hero-card-box">
      <li class="hero-card-item" *ngFor="let h of heroesList">
        <p [style]="{textAlign:&#39;center&#39;}">
          角色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:&#39;013&#39;,name:&#39;钟离&#39;,features:&#39;rock&#39;},
    {id:&#39;061&#39;,name:&#39;烟绯&#39;,features:&#39;fire&#39;},
    {id:&#39;022&#39;,name:&#39;迪奥娜&#39;,features:&#39;ice&#39;},
    {id:&#39;004&#39;,name:&#39;诺艾尔&#39;,features:&#39;rock&#39;},
  ]
}
登入後複製

然後將這個元件引入一個父元件當中:

@Component({
  selector:&#39;app-templateoutlet-app-demo&#39;,
  template:`
    <app-hero-display-card></app-hero-display-card>
  `
})
export class TemplateOutletAppDemoComponent {}
登入後複製

程式碼運行一下,效果如圖:

聊聊Angular中NgTemplateOutlet指令的理解和用法

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

那麼對於子元件HeroDisplayCard我們可以這麼改:

@Component({
  selector:&#39;app-hero-display-card&#39;,
  template:`
    <h2 id="角色列表">角色列表</h2>
    <ul class="hero-card-box">
      <ng-container *ngFor="let h of heroesList">
        <!-- 如果没有传入cardItemTemplate则显示默认 -->
        <li class="hero-card-item" *ngIf="!cardItemTemplate">
          <p [style]="{textAlign:&#39;center&#39;}">
            角色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:&#39;app-templateoutlet-app-demo&#39;,
  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指令的理解和用法的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

聊聊Angular中的元資料(Metadata)和裝飾器(Decorator) 聊聊Angular中的元資料(Metadata)和裝飾器(Decorator) Feb 28, 2022 am 11:10 AM

這篇文章繼續Angular的學習,帶大家了解Angular中的元數據和裝飾器,簡單了解一下他們的用法,希望對大家有幫助!

如何在Ubuntu 24.04上安裝Angular 如何在Ubuntu 24.04上安裝Angular Mar 23, 2024 pm 12:20 PM

Angular.js是一種可自由存取的JavaScript平台,用於建立動態應用程式。它允許您透過擴展HTML的語法作為模板語言,以快速、清晰地表示應用程式的各個方面。 Angular.js提供了一系列工具,可協助您編寫、更新和測試程式碼。此外,它還提供了許多功能,如路由和表單管理。本指南將討論在Ubuntu24上安裝Angular的方法。首先,您需要安裝Node.js。 Node.js是一個基於ChromeV8引擎的JavaScript運行環境,可讓您在伺服器端執行JavaScript程式碼。要在Ub

一文探究Angular中的服務端渲染(SSR) 一文探究Angular中的服務端渲染(SSR) Dec 27, 2022 pm 07:24 PM

你知道 Angular Universal 嗎?可以幫助網站提供更好的 SEO 支援哦!

angular學習之詳解狀態管理器NgRx angular學習之詳解狀態管理器NgRx May 25, 2022 am 11:01 AM

這篇文章帶大家深入了解angular的狀態管理器NgRx,介紹一下NgRx的使用方法,希望對大家有幫助!

Angular + NG-ZORRO快速開發一個後台系統 Angular + NG-ZORRO快速開發一個後台系統 Apr 21, 2022 am 10:45 AM

這篇文章跟大家分享一個Angular實戰,了解一下angualr 結合 ng-zorro 如何快速開發一個後台系統,希望對大家有幫助!

如何使用PHP和Angular進行前端開發 如何使用PHP和Angular進行前端開發 May 11, 2023 pm 04:04 PM

隨著網路的快速發展,前端開發技術也不斷改進與迭代。 PHP和Angular是兩種廣泛應用於前端開發的技術。 PHP是一種伺服器端腳本語言,可以處理表單、產生動態頁面和管理存取權限等任務。而Angular是一種JavaScript的框架,可以用來開發單一頁面應用程式和建構元件化的網頁應用程式。本篇文章將介紹如何使用PHP和Angular進行前端開發,以及如何將它們

淺析angular中怎麼使用monaco-editor 淺析angular中怎麼使用monaco-editor Oct 17, 2022 pm 08:04 PM

angular中怎麼使用monaco-editor?以下這篇文章記錄下最近的一次業務中用到的 m​​onaco-editor 在 angular 中的使用,希望對大家有幫助!

淺析Angular中的獨立組件,看看怎麼使用 淺析Angular中的獨立組件,看看怎麼使用 Jun 23, 2022 pm 03:49 PM

這篇文章帶大家了解Angular中的獨立元件,看看怎麼在Angular中建立一個獨立元件,怎麼在獨立元件中導入已有的模組,希望對大家有幫助!

See all articles