2017-10-30 10 views
0

私はコンポーネントファクトリを使用して、動的コンポーネントをオンザフライで生成しています。工場は、生成されたコンポーネントの入力パラメータを含むデータの配列が渡され:これは正常に動作して、「フィールド工場」コンポーネントは、データを処理オプションの注入@inputパラメータを宣言するには?

<app-field-factory [componentData]="componentSeedData"></app-field-factory> 

export class TextInputComponent implements OnInit { 

    @Input() id: number; 
    @Input() field_name: string; 
    @Input() parent: string; 
    @Input() validators: {}; 

    public fieldForm: FormGroup; 

    constructor(
     private injector: Injector, 
     private formBuilder: FormBuilder, 
    ) { 
    this.id = this.injector.get('id'); 
    this.field_name = this.injector.get('field_name'); 
    this.parent = this.injector.get('parent'); 
    this.validators = this.injector.get('validators'); 
    } 

しかし、私は(。すなわち、それは存在するかどうかわからない)オプションこれらの入力のうちの1つを作る方法を動作することはできません:生成された各コンポーネントでは、私はこのようなものを持っています。私は "?"条件付きでthis.injector.get行を折り返します。 「プロバイダがありません...」というエラーが表示されます。

場合によってはparent入力が存在しない場合があります。生成されたコンポーネント内でそれをどのように考慮しますか?

+0

のような条件を使うことができます。なぜあなたは '@Input()'を使ったのですか? 'injector'と' @Input() 'は無関係の2つです –

答えて

2

Injector.get署名

abstract get<T>(token: Type<T>|InjectionToken<T>, notFoundValue?: T): T; 

によると、あなたが2番目のパラメータとしてデフォルト値を指定することができます。

this.parent = this.injector.get('parent', null); 

この場合、角度は未解決のプロバイダについては不平を言うことはありません。それはnullを返します。次に、単純にインジェクタが必要なので、単にif (this.parent)

+0

これはここの答えです。ありがとう。 – Inigo

1

使用この:?

@Input() parent?: string; 
+0

私はそれを試しましたが、私はまだプロバイダ*エラーを受け取りません。 '@ Optional'も同じ結果を試しました。私は問題がインジェクタを使用することに関連していると仮定..?私は本当に理解していない.. – Inigo

0

コンポーネントのすべての入力は任意とみなすことができます。コンポーネントを使用するときにバインディングが定義されていない場合、値はデフォルトで初期化されずに初期化されます。

class MyComponent { 
    @Input() v; 

//結合vが正しく入力を設定するため //結合v@Input()が自動的に動的コンポーネント用の角度によって処理されていないことを

注意を初期化されないままになり、変化検出時に32に設定されます。バインディングでは、コンパイル時にコンポーネントをどのように使用するかを知る必要がありますが、これは動的コンポーネントにとっては当てはまりません。

も読み:

関連する問題