web-dev-qa-db-ja.com

Angular 8 viewChildは未定義を返します

ChildViewインスタンスにアクセスしようとしていますが、childViewが未定義であると表示され続けます。

ChildViewsのコードは次のとおりです。

@ViewChild(CreateQuestionnaireComponent,{ read: true, static: false })  private childQuestionnaireDialog:CreateQuestionnaireComponent;
@ViewChild(ProjectNavbarComponent,{ read: true, static: false })  private childProjectNavBar:ProjectNavbarComponent;
@ViewChild(QuestionnaireNodeComponent,{ read: true, static: false }) private childQuestionnaireNode:QuestionnaireNodeComponent;
....

onCreateTerminal() {
        this.childQuestionnaireDialog.generateQuestionnaireDropDownList();
        this.childQuestionnaireDialog.resetFields();
        this._hideQuestionnaireDialog = false;
        this._modalTitle = 'New Terminal';
        this._placeHolderText = 'Terminal Questionnaire Title';
        this._terminal = true;
    }

...

:this.childQuestionnaireDialog is undefinedと表示されています。

Angular 7。

私の新しい知識によれば、@ viewChildはstaticというフラグをとります。フラグをtrueに設定すると、親コンポーネントは自身の作成中にchildViewへの参照を取得しようとします。つまり、親ComponentのonInit()メソッドにchildViewのインスタンスを含めることができます。他のメソッドではアクセスできないため、基本的には1回限りのアクセスです。

フラグをfalseに設定すると、基本的にivyレンダラーの新しい方法になります。

私の場合の問題は、どちらのオプションも機能していないことです。

17
Nesan Mano

docs によると、メタデータプロパティreadは次のとおりです。

`read - read a different token from the queried elements.`

つまり、通常のViewContainerRefElementRefを省略した場合のデフォルト)ではなく、readまたはコンポーネント名を読み込む場合に使用されます。したがって、値としてtrueを置くことは、要素から型trueを返すように言っています。これは、私の知る限りでは不可能です。

より良い説明は here ですが、問題に対する簡単な答えは、readプロパティを取得するか、ElementRefまたは必要な特定のタイプを指定することです。

1
Jesse