角度コンテンツ投影の詳細な説明

角度コンテンツ投影の詳細な説明

単一コンテンツ投影

ng-contentを使用して実装する

<!-- コンポーネント- app-content-single -->
<div>
  <h2>タイトル</h2>
  <!-- 投影コンテンツの表示位置 -->
  <コンテンツ></コンテンツ>
</div>
<!-- 使用法 -->
<アプリコンテンツシングル>
  <div>これはコンテンツです</div>
</アプリコンテンツシングル>

マルチコンテンツ投影

ng-contentを使用して実装する

<!-- コンポーネント- app-content-more -->
<div>
  <h3>牧夫の称号</h3>
  <ng-content select=".header"></ng-content>
  <h3>本文タイトル</h3>
  <ng-content select="[本文]"></ng-content>
  <h3>デフォルトのタイトル</h3>
  <コンテンツ></コンテンツ>
  <h3>フッタータイトル</h3>
  <ng-content select="フッター"></ng-content>
</div>
<!-- 使用法 -->
<アプリコンテンツの詳細>
  <div>これは default01 です</div>
  <div class="header">これはヘッダーです</div>
  <div>これは default02 です</div>
  <div body>これが本文です</div>
  <div>これは default03 です</div>
  <footer>これはフッターです</footer>
  <div>これは default04 です</div>
</アプリコンテンツ>

条件付きコンテンツ投影- ng-templateng-containerdirectiveなどを使用して実現する

単一条件のコンテンツ投影

例えば、現在人々のリストがあるとします。ある人のお金が200を超えると、コンポーネントのテンプレートで定義されたコンテンツが追加されます。

ng-templateと連携してテンプレートを取得するためにappChildRefディレクティブを定義する

'@angular/core' から Directive、TemplateRef をインポートします。
@指令({
  セレクター: '[appChildRef]'
})
エクスポートクラスChildRefDirective {
  コンストラクター(パブリックテンプレートRef: TemplateRef<any>) { }
}

アプリ-人物-html

<div class="list-item" *ngFor="let person of persons;">
  <div>名前: {{ person.name }}}</div>
  <div>お金: {{ person.money }}</div>
  <div *ngIf="人.お金> 200">
    <ng-container *ngIf="childRef" [ngTemplateOutlet]="childRef.templateRef"></ng-container>
  </div>
</div>

アプリ担当者 - ts

'@angular/core' から Component、ContentChild、OnInit をインポートします。
'../../../../directives/child-ref.directive' から { ChildRefDirective } をインポートします。
@成分({
  セレクタ: 'app-persons'、
  テンプレート URL: './persons.component.html',
  スタイル URL: ['./persons.component.scss']
})
エクスポートクラスPersonsComponentはOnInitを実装します{
  人: { 名前: 文字列; お金: 数値; }[] = [
    { 名前: 'ジャック', お金: 120 },
    { 名前: 'Li Li', お金: 210 },
    { 名前: '張三', お金: 170 },
  ];
  ChildRefDirective は、コンテンツ オブジェクトの子として宣言されます。
  コンストラクタ() { }
  ngOnInit(): void { }
}

使用

<アプリの人物>
  <ng-template アプリの子参照>
    <div style="font-size: 14px; color: red;">これは子参照コンテンツです</div>
  </ng-テンプレート>
</app-persons>

レンダリング

レンダリング

複数の条件付きコンテンツ投影

例: 埋め込みテンプレートをバインドして、人物データのフィールドを通じて表示したいとします。

appChildRef 調整

'@angular/core' から Directive、Input、TemplateRef をインポートします。
@指令({
  セレクター: '[appChildRef]'
})
エクスポートクラスChildRefDirective {
  // 定義されたテンプレート名を受け入れ、この名前と persons のレンダリング フィールドを通じて対応するテンプレート コンテンツを表示します @Input() appChildRef!: string;
  コンストラクター(パブリックテンプレートRef: TemplateRef<any>) { }
}

アプリ-人物-html

<div class="list-item" *ngFor="let person of persons;let i=index;">
  <div>名前: {{ person.name }}}</div>
  <div>お金: {{ person.money }}</div>
  <!-- <div *ngIf="person.money > 200">
    <ng-container *ngIf="childRef" [ngTemplateOutlet]="childRef.templateRef"></ng-container>
  </div> -->
  <div *ngIf="person.render && tempRefs[person.render]">
    <!-- ngTemplateOutlet ディレクティブを使用して、現在の人物データをテンプレートに渡します -->
    <ng-container *ngTemplateOutlet="tempRefs[person.render].templateRef; コンテキスト: { $implicit: person, i: i }"></ng-container>
  </div>
</div>

アプリ担当者 - ts

'@angular/core' から Component、ContentChild、ContentChildren、OnInit、QueryList をインポートします。
'../../../../directives/child-ref.directive' から { ChildRefDirective } をインポートします。
@成分({
  セレクター: 'app-form-unit',
  テンプレート URL: './form-unit.component.html',
  スタイル URL: ['./form-unit.component.scss']
})
エクスポートクラスFormUnitComponentはOnInitを実装します{
  persons: { name: 文字列; money: 数値; render?: 文字列; }[] = [
    { 名前: 'ジャック', お金: 120, レンダリング: 'temp1' },
    { name: '李璃', money: 210, render: 'temp2' },
    { name: '张三', money: 170, render: 'temp3' },
  ];
  // @ContentChild(ChildRefDirective, { static: true }) childRef!: ChildRefDirective;
  @ContentChildren(ChildRefDirective) childrenRef!: QueryList<ChildRefDirective>;
  tempRefs() を取得する {
    定数 aObj: 任意 = {};
    this.childrenRef.forEach(テンプレート => {
      定数キー: string = template.appChildRef;
      aObj[キー] = テンプレート;
    })
    aObj を返します。
  }
  コンストラクタ() { }
  ngOnInit(): void { }
}

使用

<アプリの人物>
  <ng-template appChildRef="temp1" let-person let-index="i">
    <div style="font-size: 14px; color: red;">{{index}}-{{person.name}}: これは temp1 です</div>
  </ng-テンプレート>
  <ng-template appChildRef="temp2" let-person let-index="i">
    <div style="font-size: 14px; color: green;">{{index}}-{{person.name}}: これは temp2 です</div>
  </ng-テンプレート>
  <ng-template appChildRef="temp3" let-person let-index="i">
    <div style="font-size: 14px; color: orange;">{{index}}-{{person.name}}: これは temp3 です</div>
  </ng-テンプレート>
</app-persons>

レンダリング

レンダリング

要約する

この記事はこれで終わりです。皆さんのお役に立てれば幸いです。また、123WORDPRESS.COM のその他のコンテンツにも注目していただければ幸いです。

以下もご興味があるかもしれません:
  • Angularコンポーネント投影の詳細な説明
  • Angularプロジェクトにおける共有モジュールの実装の詳細な説明
  • Angularルーティングサブルートの詳細な説明
  • Angularルーティングの基礎の詳細な説明
  • Angularコンポーネントのライフサイクルの詳しい説明(パート2)
  • Angularコンポーネントライフサイクルの詳細説明(I)
  • Angularコンポーネントの仲介モードの詳細な説明

<<:  Linux で XFS パーティション形式のルート ディレクトリを縮小する方法

>>:  SQL 集計、グループ化、並べ替え

ブログ    

推薦する

Linux のソフトリンクとハードリンクの詳細な説明

目次1. ファイルとディレクトリの基本的な保存2. Inコマンドの紹介(1)lnコマンドの基本情報を...

Reactでaxiosを使用してリクエストを送信する一般的な方法

目次Reactにaxios依存関係をインストールして導入するGETリクエストにaxiosを使用するa...

JavaScript 構造化代入の詳細な説明

目次コンセプト配列の分割値を個別に宣言して割り当てるデフォルト値の構造化解除変数値の交換関数によって...

IDEA で Docker プロジェクトをデプロイする手順

現在、ほとんどのプロジェクトが Docker 上にデプロイされ始めていますが、デプロイのプロセスはま...

jsネイティブ構文プロトタイプ、__proto__、コンストラクタの徹底的な理解

目次1 はじめに2 前提条件2.1 データ型2.2 それが自身のプロパティであるかどうかを判断する ...

Docker Swarm 外部検証ロードバランシングが機能しない場合の解決策

問題の説明Centos7 をローカルにインストールして 3 つの仮想マシンを作成し、Swarm クラ...

CentOS 6 および 7 での MySQL 5.7 の詳細なインストール チュートリアル

開発には常にデータが必要です。サーバーとしての Linux では、テスト データを格納するためのデー...

Ubuntu 18.04 に vsftpd をインストールするための実装コード

vsftpdをインストールする $ sudo apt-get install vsftpd -y v...

mysql5.7.14 解凍版インストールと設定方法 グラフィックチュートリアル (win10)

Win10はmysql5.7の解凍版をインストールします。参考までに、具体的な内容は次のとおりです...

角度付き双方向バインディングの詳細な説明

目次双方向バインディングの原理ngモデルレンダリングカスタム双方向バインディングプロパティコンポーネ...

IDEA で mysql8.0.3 と mybatis-generator を使用する際に発生するバグ

1. プラグインを追加し、pomファイルの下に次の設定を追加します。 <!-- mybatis...

Vue ルーティング遅延読み込みの詳細

目次1. ルートの遅延読み込みとは何ですか? 2. ルートの遅延読み込みの使用1. ルートの遅延読み...

MySQL デッドロック シナリオ例の分析

序文最近、MySQL で RR レベルでデッドロック問題に遭遇しました。興味深いと思ったので、調べて...

MySQL で遅い SQL 文を見つける方法

MySQL で遅い SQL ステートメントを見つけるにはどうすればよいでしょうか?これは、多くの人を...