Angular @ViewChild()エラー:引数が2つ必要ですが、1つ取得しました


249

ViewChildを試行すると、エラーが発生します。エラーは、「 'opts'の引数が指定されていませんでした。」

@ViewChildの両方がエラーを出しています。

import { Component, OnInit, ElementRef, ViewChild, Output, EventEmitter } from '@angular/core';
import { Ingredient } from 'src/app/shared/ingredient.model';

@Component({
  selector: 'app-shopping-edit',
  templateUrl: './shopping-edit.component.html',
  styleUrls: ['./shopping-edit.component.css']
})
export class ShoppingEditComponent implements OnInit {

@ViewChild('nameInput') nameInputRef: ElementRef;
@ViewChild('amountInput') amountInputRef: ElementRef;
@Output() ingredientAdded = new EventEmitter<Ingredient>();
  constructor() {}

  ngOnInit() {
  }

  onAddItem() {
    const ingName = this.nameInputRef.nativeElement.value;
    const ingAmount = this.amountInputRef.nativeElement.value;
    const newIngredient = new Ingredient(ingName, ingAmount);
    this.ingredientAdded.emit(newIngredient);
  }

}

ts(11,2):エラーTS2554:2つの引数が必要ですが、1を取得しました


行11には何がありますか?
Tony Ngo

@TonyNgo @ViewChild( 'nameInput')nameInputRef:ElementRef;
スタックオーバーフロー

回答:


497

Angular 8では、ViewChildは2つのパラメーターを取ります

 @ViewChild(ChildDirective, {static: false}) Component

9
承認済みとしてマークしてください。Angular docsから:static-変更検出の実行前にクエリ結果を解決するかどうか(つまり、静的結果のみを返す)。このオプションが指定されていない場合、コンパイラーはデフォルトの動作にフォールバックします。これは、クエリ結果を使用してクエリ解決のタイミングを決定することです。クエリ結果がネストされたビュー(* ngIfなど)内にある場合、クエリは変更検出の実行後に解決されます。それ以外の場合は、変更検出が実行される前に解決されます。
Jensen

12
彼にあなたの答えを最高のものとして受け入れてほしい場合は、それを答えに追加する必要があります
Sytham

14
注:Angular 7での動作を維持するには、を指定する必要があります{ static: true }ng update必要に応じてこれを自動的に行うのに役立ちます。:または、あなたはすでに角度8へのあなたの依存関係をアップグレードした場合、このコマンドは、移行あなたのコードのに役立ちますng update @angular/core --from 7 --to 8 --migrate-only
evilkos

11
ngOnInit中に要素を使用できるようにする必要がある場合、staticをにする必要がありますtrueが、initの後まで待機できる場合falseは可能です。つまり、ngAfterViewInit / ngAfterContentInitまで使用できません。
Armen Zakaryan

知らなかった。ありがとう。:-)
タンジール

84

角度8

Angular 8では、ViewChildに別のパラメーターがあります

@ViewChild('nameInput', {static: false}) component

あなたはそれについてここここでもっと読むことができます

角度9

ではAngular 9デフォルトの値ですstatic: falseので、使用したい場合を除きPARAMを提供する必要はありません。{static: true}


リンクした記事の1つに、のような構文が表示されています@ContentChild('foo', {static: false}) foo !: ElementRef;。感嘆符について知りたいです。Angular 8でもそれは新しいことですか?
Konrad Viltersten、

1
@KonradVilterstenは、このstackoverflow.com/a/56950936/2279488を
Reza

26

Angular 8では、ViewChild2つのパラメーターを取ります:

このようにしてみてください:

@ViewChild('nameInput', { static: false }) nameInputRef: ElementRef;

説明:

{static:false}

static falseを設定すると、コンポーネントは常に、ngAfterViewInit/ngAfterContentInitコールバック関数の時間内にビューの初期化後に初期化されます。

{static:true}

あなたが設定した場合、真の静的、初期設定では、ビューの初期化時に行われますngOnInit

デフォルトではを使用できます{ static: false }。動的ビューを作成していて、テンプレート参照変数を使用したい場合は、{ static: true}

詳細については、この記事を読むことができます

作業デモ

デモでは、テンプレート参照変数を使用してdivまでスクロールします。

 @ViewChild("scrollDiv", { static: true }) scrollTo: ElementRef;

では{ static: true }、私たちが使用することができますthis.scrollTo.nativeElementngOnInitはなくて{ static: false }this.scrollToになりますundefinedngOnInit、我々は唯一にでアクセスできるように、ngAfterViewInit


6

それはビューの子が2つの引数を必要とするためです

@ViewChild( 'nameInput'、{static:false、})nameInputRef:ElementRef;

@ViewChild( 'amountInput'、{static:false、})amountInputRef:ElementRef;


3

Angular 8では、ViewChildは常に2つのパラメーターを取り、2番目のパラメーターは常にstatic:trueまたはstatic:falseを持ってい ます

あなたはこのように試すことができます:

@ViewChild('nameInput', {static: false}) component

また、これstatic: falseはAngular 9のデフォルトのフォールバック動作になります。

静的なfalse / trueとは何ですか?したがって、経験則として、次のことを行うことができます。

  • { static: true } ngOnInitでViewChildにアクセスするときに設定する必要があります。

    { static: false }ngAfterViewInitでのみアクセスできます。これは、テンプレートの要素に構造的ディレクティブ(* ngIf)がある場合にも適用したいものです。


1

IDEAを介してすべてを置き換えるための正規表現(Webstormでテスト済み)

検索: \@ViewChild\('(.*)'\)

交換: \@ViewChild\('$1', \{static: true\}\)


1

次のように、ViewChildで2番目の引数を使用する必要があります。

@ViewChild("eleDiv", { static: false }) someElement: ElementRef;


0

Angular 8では、ViewChildに別のパラメーターがあります

@ViewChild( 'nameInput'、{static:false})コンポーネント

以下のように問題を解決しました

@ViewChild(MatSort、{static:false})並べ替え:MatSort;


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.