2017-04-04 5 views
1

選択した入力(ラジオまたはチェックボックス)に基づいて、コンポーネントを動的にajaxで追加します。Angular2 - 循環参照の動的コンポーネントに注入すると依存関係注入が機能しない

Plunkr:我々はquestions.jsonからのJSONレスポンスを取得し、質問を移入src/parent/parent.ts

第1層:https://plnkr.co/edit/uvGo3RxCkUPeuknVu9m8?p=preview

私はより良い理解のための流れを説明します。

controlTypeに基づいて、a-componentまたはb-componentのいずれかをsrc/parent/parent.htmlにロードします。

私はa-componentのチェックボックスまたはb-componentのラジオボタンを選択すると、私はcreateDynamicComponent()を呼び出し、componentDataに渡します。

componentDataは、選択したオプションに基づいて、次のコンポーネントのメタデータ情報になります。

さて、componentDatadynamic-componentインサイドsrc/controls/a.htmlまたはsrc/controls/b.html

からdynamic-componentに渡され、私はプロバイダを解決し、entryComponentsにquestionsデータを注入し、(a-componentb-component

すべてが正常に動作して私はHService(コンポーネントデータ構築ロジックを保持する)をa-componentb-componentの両方に導入しました。

私は、次のエラーを取得しています

Error: Can't resolve all parameters for BComponent: ([object Object], [object Object], ?)

私はサービスを取り出し、コメントコードを使用する場合は、b-componentのコンストラクタ内部HServiceである最後のパラメータは、すべてが正常に動作します。

this.componentData = { 
 
    'questions': { 
 
    "question": "This is a " + this.level + " level question?", 
 
    "controlType": "radio", 
 
    "answers": [ 
 
     "Yes", 
 
     "No", 
 
     "None" 
 
    ] 
 
    }, 
 
    "component": BComponent, 
 
    "level": this.level 
 
};

編集1:私はHServiceはすでにa-componentに注入しており、そこには、プロバイダの解決エラーはありませんし、それが正常に動作しています。 b-componentに追加するだけで、私はエラーに直面します。

大歓迎です!

答えて

3

私は問題が循環依存に基づいていると思います。私はHServiceための抽象クラスを作成することにより、依存性を発揮し、トークンとしてそれを使用することになり、それを解決するために

A <=> HServiceB <=> HService

base.h.TS

export abstract class BaseHService { 
    private componentData: any; 

    abstract getComponentData(queries: IQ[], level: number): any; 
} 

app.module.ts

providers: [ 
    { provide: BaseHService, useClass: HService }, <== this line 
    { provide: 'questions', useValue: {} }, 
    { provide: 'level', useValue: 1 } 
], 

a.ts

import { BaseHService } from "../h/base.h"; 
... 
constructor(...private _h: BaseHService) { 

b.ts

import { BaseHService } from "../h/base.h"; 
... 
constructor(...private _h: BaseHService) { 

Modified Plunker

+0

ナイスキャッチがありますが、これは従うべき良好なパターンであると思いますか?私は同じタイプのコンポーネントを動的に作成するコンポーネントを意味します。再帰的にそれをそれに追加します。ダイナミックコンポーネント注入部分は、私の意見では分かりませんが、サービスでは分離する必要があります。 – echonax

+0

@yurzuiソリューションに感謝します。それは素晴らしい仕事です。あまりにも理解し、Angular2で学ぶ – MrVinay1989

+0

@echonax私はサービスに動的コンポーネント注入部分を作ることを考えています。それを調べます。 – MrVinay1989

関連する問題