コンポーネントはインラインテンプレートでトランスクルージョンします

JPテンベルジュ

私はAngular2-rc3を使用していて、Componentトランスクルージョンを少し異なる方法で適用したいと思っています。これが私のコンポーネントです:

import { Component, Input } from '@angular/core';

@Component({
    selector: 'my-list',
    template: `<ul>
        <li *ngFor="let item of data">
            -- insert template here --
            <ng-content></ng-content>
        </li>
    </ul>`
})
export class MyListComponent {
    @Input() data: any[];
}

そして、私はそれを次のように使用します:

<my-list [data]="cars">
    <div>{{item.make | uppercase}}</div>
</my-list>

ご覧のとおり、コンポーネントで使用されるインラインテンプレートを定義しようとしています。今、これはひどく間違っています。まず、それを言うデータバインディングの例外can't read property 'make' of undefineditem.makeではなく、周囲のコンポーネントを読み取ろうとしていますMyListComponentしかし、今のところこれを一時的に無効にしても:

<my-list [data]="cars">
    <div>{item.make | uppercase}</div>
</my-list>

次に、2番目の問題が発生します。

-- insert template here --
-- insert template here --
-- insert template here --
-- insert template here --
{item.make | uppercase}

したがって、Angularは実際には*ngFor内で使用するためにテンプレートをコピーするのではなく、要素をバインドするだけで、最終的に最後のアイテムに関連付けられます。

これを機能させるにはどうすればよいですか?

私はAngularJSでも同じ問題を抱えていました。そこでは、petebacondarwinコンパイルを通じてDOMを操作するソリューションを投稿しました。これは素晴らしいことでした。ElementRefコンポーネントに注入することで、Angular 2でもこのオプションを利用できますが、!大きな違いの1つはcompile、AngularJSではデータバインディングの前にオフになったということ{{item.make}}です。つまり、テンプレートでの使用問題はありませんでしたAngular 2では、{{item}}事前に解析されているため、これは問題ないようです。それで、これについて行くための最良の方法は何ですか?[[item]]全体を置き換えるためにわずかに異なる表記法と文字列を使用することは、最もエレガントな方法ではないようです...

前もって感謝します!

//編集:これが問題を再現するPlnkrです。

リチャード・マッセン

ngForTemplateメソッドを詳しく説明するには

Angular 4以降、要素は現在呼ばれてい<ng-template>ます。)

  1. <template>代わりに、外部コンポーネントと内部コンポーネントの両方でタグを使用し<ng-content>ます。

  2. <li>app.component HTMLに移動し、<template>このコンポーネントには、特別な持って「let-」内部コンポーネントに反復変数を参照する属性を:

    <my-list [data]="cars">
      <template let-item>
        <li>
          <div>{{item.make | uppercase}}</div>
        </li>
      </template>
    </my-list>
    
  3. 内部コンポーネントに<template>も同様の機能があり、次のようにngForのバリアントを使用します。

    <ul>
        <template #items ngFor [ngForOf]="data" [ngForTemplate]="tmpl">
            -- insert template here --
        </template>
    </ul>
    
  4. ngForTemplate属性に割り当てられた「tmpl」変数は、コンポーネントコードでフェッチする必要があります。

    export class MyListComponent {
        @Input() data: any[];
        @ContentChild(TemplateRef) tmpl: TemplateRef;
    }
    
  5. @ContentChildとTemplateRefは角度ビットなので、インポートする必要があります

    import { Component, Input, ContentChild, TemplateRef } from '@angular/core';
    

ここplnkrでこれらの変更を加えたプランカーのフォークを参照してください

データをリストに渡すので、これはあなたが述べた問題に対して最も満足のいく解決策ではありません。外側にngForがあるかもしれません。さらに、追加のコンテンツ(リテラル '-ここにテンプレートを挿入-')が削除されるため、外部テンプレートにも含まれている必要があることを表示する必要がありました。

反復が内部コンポーネント内で提供される場合(たとえば、サービス呼び出しから)、コードでテンプレートの操作を行う場合に役立つ可能性があることがわかります。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

VueJSはインラインテンプレートコンポーネントでHTMLを再コンパイルします

分類Dev

Vueルーターのベストプラクティス:ストアまたはコンポーネントでリダイレクトしますか?

分類Dev

コンポーネントテンプレートのインラインスタイルパラメータとして変数を補間しますか?

分類Dev

.vue コンポーネント内にインライン テンプレートをネストする

分類Dev

ニューラルネットワークのコンテキストでのプロジェクションレイヤーとは何ですか?

分類Dev

ニューラルネットワークのコンテキストでのプロジェクションレイヤーとは何ですか?

分類Dev

ニューラルネットワークのコンテキストでのプロジェクションレイヤーとは何ですか?

分類Dev

テンプレート内のvuejsコンポーネントでクラスをインポートして使用する

分類Dev

typedefコンポジションからネストクラステンプレートタイプを推測する方法は?

分類Dev

Angular-コンポーネント内のトランスクルージョンされた要素にプロパティバインディングとイベントを追加します

分類Dev

Angular2はトランスクルージョンされたコンテンツをループ変数にバインドします

分類Dev

ネストされたトランスクルージョンディレクティブは、内部のトランスクルージョンされたコンテンツを間違った場所にレンダリングします

分類Dev

テンプレートのコンパイルエラー:コンポーネントテンプレートには、laravelを使用したvue.jsのテキストだけでなく、ルート要素が必要です

分類Dev

カスタムコンポーネント、テンプレートのコンパイルエラー

分類Dev

from句のないPythonインポートステートメントは、モジュールではなくクラスをインポートします

分類Dev

Reactコンポーネントでリダイレクトを行うための適切なライフサイクルステージは何ですか?

分類Dev

クラスメンバー変数をC ++テンプレートでコンパイルしますか?

分類Dev

テンプレートとしてインポートされたバニラWebコンポーネントをレンダリングできません

分類Dev

PHPクラスをブレードテンプレートにインポートし、子テンプレートで使用する方法はありますか?

分類Dev

Reactコンポーネントはレンダリング内でオーバーライドします

分類Dev

Reactスタイリングのベストプラクティス。グローバルレベルまたはコンポーネントレベル

分類Dev

VueJs:インラインテンプレートを使用して埋め込みコンポーネント内からデータにアクセスする

分類Dev

Enzymeは、ベースコンポーネントではなくラップされたコンポーネントをレンダリングします

分類Dev

React.renderは何を返しますか?コンポーネントインスタンスまたはコンポーネントクラス?

分類Dev

フォルダーからパワーポイントスライドのテキストボックスから文字列を削除します-エラーActiveXコンポーネントはオブジェクトを作成できません

分類Dev

Angular-CLIはプロジェクトライブラリにコンポーネントを作成します

分類Dev

プレーンVueコンポーネント(単一ファイルコンポーネントではない)をテストする方法

分類Dev

プレゼンテーションコンポーネントのreturnステートメント内のifステートメントが予期しないトークンエラーをスローしています

分類Dev

タイプスクリプトによるVue2のコンポジションAPIでvueクラスコンポーネントを使用する方法

Related 関連記事

  1. 1

    VueJSはインラインテンプレートコンポーネントでHTMLを再コンパイルします

  2. 2

    Vueルーターのベストプラクティス:ストアまたはコンポーネントでリダイレクトしますか?

  3. 3

    コンポーネントテンプレートのインラインスタイルパラメータとして変数を補間しますか?

  4. 4

    .vue コンポーネント内にインライン テンプレートをネストする

  5. 5

    ニューラルネットワークのコンテキストでのプロジェクションレイヤーとは何ですか?

  6. 6

    ニューラルネットワークのコンテキストでのプロジェクションレイヤーとは何ですか?

  7. 7

    ニューラルネットワークのコンテキストでのプロジェクションレイヤーとは何ですか?

  8. 8

    テンプレート内のvuejsコンポーネントでクラスをインポートして使用する

  9. 9

    typedefコンポジションからネストクラステンプレートタイプを推測する方法は?

  10. 10

    Angular-コンポーネント内のトランスクルージョンされた要素にプロパティバインディングとイベントを追加します

  11. 11

    Angular2はトランスクルージョンされたコンテンツをループ変数にバインドします

  12. 12

    ネストされたトランスクルージョンディレクティブは、内部のトランスクルージョンされたコンテンツを間違った場所にレンダリングします

  13. 13

    テンプレートのコンパイルエラー:コンポーネントテンプレートには、laravelを使用したvue.jsのテキストだけでなく、ルート要素が必要です

  14. 14

    カスタムコンポーネント、テンプレートのコンパイルエラー

  15. 15

    from句のないPythonインポートステートメントは、モジュールではなくクラスをインポートします

  16. 16

    Reactコンポーネントでリダイレクトを行うための適切なライフサイクルステージは何ですか?

  17. 17

    クラスメンバー変数をC ++テンプレートでコンパイルしますか?

  18. 18

    テンプレートとしてインポートされたバニラWebコンポーネントをレンダリングできません

  19. 19

    PHPクラスをブレードテンプレートにインポートし、子テンプレートで使用する方法はありますか?

  20. 20

    Reactコンポーネントはレンダリング内でオーバーライドします

  21. 21

    Reactスタイリングのベストプラクティス。グローバルレベルまたはコンポーネントレベル

  22. 22

    VueJs:インラインテンプレートを使用して埋め込みコンポーネント内からデータにアクセスする

  23. 23

    Enzymeは、ベースコンポーネントではなくラップされたコンポーネントをレンダリングします

  24. 24

    React.renderは何を返しますか?コンポーネントインスタンスまたはコンポーネントクラス?

  25. 25

    フォルダーからパワーポイントスライドのテキストボックスから文字列を削除します-エラーActiveXコンポーネントはオブジェクトを作成できません

  26. 26

    Angular-CLIはプロジェクトライブラリにコンポーネントを作成します

  27. 27

    プレーンVueコンポーネント(単一ファイルコンポーネントではない)をテストする方法

  28. 28

    プレゼンテーションコンポーネントのreturnステートメント内のifステートメントが予期しないトークンエラーをスローしています

  29. 29

    タイプスクリプトによるVue2のコンポジションAPIでvueクラスコンポーネントを使用する方法

ホットタグ

アーカイブ