2017-10-14 14 views
1

与えられたjsonデータ構造に従ってコンポーネントを読み込むことができるかどうか試してみるために、小さなpocを作成中です。 jsonはコンポーネントセレクタを提供し、配列します。私は、オンラインで見つけた参考資料に従って、小さな例を試しました。私は基本的にコンポーネントのカップルを作成アンギュラjsonスキーマを使用した角4の動的コンポーネントの読み込み

による方法をお勧めします「componentFactoryResolver」を使用し、私のモジュールに

entryComponents: [PersonalDetailsComponent, ContactDetailsComponent], 

と私のアプリのコンポーネントで、私は次のように使用をたどるようentrycomponentデコレータでそれを登録しましたコード

@ViewChild('dynamicInsert', { read: ViewContainerRef }) dynamicInsert: ViewContainerRef; 
    constructor(private componentFactoryResolver: ComponentFactoryResolver) { 
    } 
    ngAfterViewInit() { 
    const componentFactory = this.componentFactoryResolver.resolveComponentFactory(PersonalDetailsComponent); 
    const componentFactory2 = this.componentFactoryResolver.resolveComponentFactory(ContactDetailsComponent); 
    this.dynamicInsert.clear(); 
    this.dynamicInsert.createComponent(componentFactory); 
    this.dynamicInsert.createComponent(componentFactory2); 
    } 

私が使用しているコンポーネントごとにコンポーネントを作成する必要があります。これを内部ループにすることは、それを実行する最善の方法ではないかもしれません。誰かが私に正しい方法でそれをするためにいくつかの頭を与えることができれば、私は非常に感謝します。 すでにcomponentFactoryResolverは、コードからコンポーネントを動的に作成するための正しい方法で見つけてきたように、私の実際のJSONこの

{ 
     "step":"1", 
     "viewed":false, 
     "stepDependant":{ 
      "parentComponent":null, 
      "childComponent":null, 
      "varMap":null 
     }, 
     "widgets":[ 
      { 
       "Component":"shipper", 
       "inputs":[ 
        { 
        "ServiceLine":"Export" 
        } 
       ], 
       "outputs":[ 

       ], 
       "name":"Shipper Details" 
      }, 
      { 
       "Component":"shipper", 
       "inputs":[ 
        { 
        "ServiceLine":"Export" 
        } 
       ], 
       "outputs":[ 

       ], 
       "name":"Consignee Details" 
      }, 
      { 
       "Component":"status-of-shipment", 
       "inputs":[ 

       ], 
       "outputs":[ 

       ], 
       "name":"Status of Shipment" 
      } 
     ] 
     } 

多くのようなもののように見えるでしょうが、あなたの入力

+0

読んでください[ここでは、角度の動的コンポーネントについて知りたいことがあります](https://blog.angularindepth.com/here-is-what-you-need-to-know-about-dynamic-components-in -angular-ac1e96167f9e) –

答えて

2

を感謝しています。 このアプローチでは、コンポーネントセレクタをコンポーネントタイプにマップするマップまたはサービスを作成します。このようにして、JSONデータから動的コンポーネントを作成するときに、型をすばやく参照できます。これらのタイプから、ファクトリを解決して、サンプルのようなコンポーネントを追加します。

あなたは別の選択肢を知られているコンポーネントの定義済みのセットは、このような親コンポーネントに<ng-template>としてそれらすべてを定義するだろうしている場合:

<ng-template #shipper><shipper ></shipper></ng-template> 
<ng-template #statusOfShippment><status-of-shipment ></status-of-shipment></ng-template> 

次にあなたが使用して、コンポーネント内のテンプレートを取得することができます@ViewChildデコレータ。

@ViewChild('shipper') 
shipperTemplate: TemplateRef<any>; 
@ViewChild('statusOfShippment') 
statusOfShippmentTemplate: TemplateRef<any>; 

そして、工場と同じような方法でコンポーネントを作成することができます。

this.dynamicInsert.createEmbeddedView(shipper); 
this.dynamicInsert.createEmbeddedView(statusOfShippment); 

このアプローチの利点は、従来のテンプレートバインディングを使用して、すべてのテンプレートに異なるコンテキストオブジェクトを送信できることです。

<ng-template #shipper><shipper [ServiceLine]="ServiceLine"></shipper></ng-template> 

this.dynamicInsert.createEmbeddedView(shipper, {ServiceLine:"Export"}); 

このようにして、JSONから作成したオブジェクトを直接送信し、コンポーネントバインディングを構成することができます。コンポーネントファクトリを使用する場合は、コードからすべてを手動で設定する必要があります。

+0

あなたが言及した2番目の方法は、あらかじめ定義されたコンポーネントにとって便利なようです。ありがとう、あなたが提案した方法でそれを試してみましょう。しかし、あなたが私のためにそれについての詳細を得るための参照資料のカップルを持つことができる場合は非常に適切です。 – Dark99

+0

公式のドキュメンテーションからこの記事(構造ディレクティブを書く)(https://angular.io/guide/structural-directives#write-a-structural-directive)を参照すると、彼らはこれを使ってカスタムを作成しますディレクティブを使用してテンプレートを表示します。また、[ViewContainerRef](https:// angular)の公式ドキュメントもチェックしてください。io/api/core/ViewContainerRef)がありますが、残念ながらサンプルはありません。私はいくつかのブログでサンプルを見つけましたが、今それを見つけることはできません。 – AlesD

+0

参考に感謝します。ちょうど簡単な説明をしたかっただけです。構造的な方法を使用する場合は、ホストテンプレートを事前に定義する必要があります。また、コンポーネントを再利用する場合は、ホストビューでセレクタを複数回使用する必要があります。>> – Dark99

関連する問題