2016-10-10 4 views
2

コンポーネントの子インスタンスを制御しようとしていますが、エラーを超えて進むことはできません。私はthis issueからの答えに沿って従おうとしています。親コンポーネントの@ViewChildrenにアクセスできない

親コンポーネントSequenceには、子コンポーネントであるSequenceStepが含まれています。その後、私が子供について何かをしようとしています

@ViewChildren(SequenceStep) steps: QueryList<SequenceStep>;

:親は次の宣言が含まれてい

ngAfterViewInit() { 
    this.steps.changes.subscribe(steps => { 
     console.log(steps); 
    }); 
} 

私は取得していますエラーは次のとおりです。

metadata_resolver.js:639 Uncaught Error: Can't construct a query for the property "steps" of "Sequence" since the query selector wasn't defined.

のに対し、 SequenceSequenceStepのコンポーネントのセレクタは、デコレータの@Componentに定義されています( sequenceおよびsequence-step)。

私はここで間違っていますか?

+1

あなたはプランナーで再現できますか? –

+0

@GünterZöchbauer申し訳ありませんが、plnkrを作り直すのにはしばらく時間がかかりましたが、ここにはhttps://plnkr.co/edit/tusSBpbmyoG6TQTcV2i0?p=previewがありません(コンソールをご覧ください)。コードは正しいですか? – user776686

答えて

1

いくつ

  • はあなたが外から子どもたちを渡すと、彼らは子供のコンテンツではありませんがあります。 @ViewChild()は、コンポーネントのテンプレートに直接追加された子に対してのみ機能します。トランスクルードコンテンツの

    @ContentChildren()作品:

    @ContentChildren(TheChild) kids: QueryList<TheChild>; 
    
  • this.kids.changes()のみ初期化後の変更について通知します。 は、そのためだけngAfterViewInit()に直接this.kidsにアクセスし、次いで約後で通知を得るためにsubsribe

    ngAfterViewInit() { 
        this.myKidsCount = this.kids.length; 
        this.cdRef.detectChanges(); 
    
        this.kids.changes.subscribe(kids => { 
         this.myKidsCount = kids.length; 
        }); 
    } 
    
  • を変更する変更検出は、変化を引き起こしたときに角度が好きではありません。 ngAfterViewInit()が変更検出によって呼び出されたため、this.myKidsCount = this.kids.lengthは例外を発生させます。回避するには

私はプロパティmyKidsCountを変更した後、明示的に変化検出を起動します。

constructor(private cdRef:ChangeDetectorRef){} 

ngAfterViewInit() { 
    this.myKidsCount = this.kids.length; 
    this.cdRef.detectChanges(); 
} 

Plunker example

2

@ViewChildren引数に引用符を追加しようとしましたか?

@ViewChildren('SequenceStep') steps: QueryList<SequenceStep>;

+1

引用符は、テンプレート変数名を照会する場合にのみ使用します。コンポーネントまたは疑似命令型を照会する場合は、引用符を使用する必要はありません。 –

+0

チップをありがとうございます。 – lmetdaoui

+0

これは私のために働いた –

1

この問題はSequenceStepの輸入に関連することができ、クラス名を確認関連するインポート行。

+0

合意。また、親コンポーネントと同じファイルで定義されているディレクティブ(ViewChild)がある場合、ディレクティブ定義が最初に来る必要があります。 – Miller

0

@ViewChildren('SequenceStep') steps: QueryList<SequenceStep>;

は私のために働きました。角度4.X.X角度CLI 1.X.X

関連する問題