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

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

単一コンテンツ投影

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 集計、グループ化、並べ替え

推薦する

MySQL 8.0 の統計が不正確である理由

序文Oracle であれ MySQL であれ、新バージョンで導入された新機能は、一方では製品の機能性...

Vueは複数のカウントダウンを同時に設定する機能を実装しています

この記事の例では、複数のカウントダウンを同時に設定するためのVueの具体的なコードを参考までに共有し...

独自のサーバーを素早く構築する方法の詳細なチュートリアル(Java 環境)

1. サーバーの購入1. 私はAlibaba Cloudのサーバーを選択しました。学生向けで月額9...

Linux システムが VMware にインストールされているかどうかを確認する方法

現在の Linux システムが VMware にインストールされているかどうかを確認する方法を教えて...

TypeScript ジェネリックパラメータのデフォルト型と新しい厳密なコンパイルオプション

目次概要コンポーネントクラスの型定義を作成するジェネリック型を使用してPropsとStateを定義す...

mysqlを使用して、URLから返されたhttp GETリクエストデータを記録します。

ビジネスシナリオの要件と実装ロジックの分析ビジネスでは、HTTP GET を使用してデータを要求する...

Vueはメニューナビゲーションを実装するためにelement-uiを使用します

この記事では、Element-uiを使用してメニューナビゲーションを実装するVueの具体的なコードを...

CSSはメッセージパネルをスライドするWebコンポーネント機能を実装します

みなさんこんにちは。私と同じように混乱している方はいらっしゃいませんか。CSS は簡単に始められます...

MySQL で中国語の文字をピンインでソートする簡単な例

名前を格納するフィールドが GBK 文字セットを使用している場合、GBK 内部コード自体がエンコード...

VMware Workstation 14 Pro インストール Ubuntu 16.04 チュートリアル

この記事では、VMware Workstation14 ProにUbuntu 16.04をインストー...

Tomcat パイプライン モードのパイプラインとバルブの詳細な説明

序文比較的複雑な大規模システムでは、複雑なロジックで処理する必要があるオブジェクトまたはデータ フロ...

HTML のスクロールバーについて/スクロールバーの削除

1. xhtmlの下のスクロールバーの色元の HTML では、ページ全体のスクロール バーを次のよう...

Vueはグラフィック検証コードを実装する

この記事の例では、グラフィック検証コードを実装するためのVueの具体的なコードを参考までに共有してい...

Tomcat の一般的な例外と解決コードの例

弊社のプロジェクトは Java で開発され、ミドルウェアは Tomcat でした。運用中に、Tomc...

docker での psql データベースのバックアップとリカバリの詳細な説明

1. DockerでのPostgresデータベースのバックアップ注文: docker exec it...