typescript - Angular @ViewChild() erreur : 2 arguments attendus, mais 1 reçu
Lorsque j'essaie ViewChild, je reçois l'erreur. L'erreur est « Aucun argument pour 'opts' n'a été fourni. »
Les deux @ViewChild donnent l'erreur.
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) : erreur TS2554 : 2 arguments attendus, mais 1 a été fourni.
Réponse #1
Dans Angular 8, ViewChild prend 2 paramètres
@ViewChild(ChildDirective, {static: false}) Component
Réponse #2
Angular 8
Dans Angular 8, ViewChild a un autre paramètre
@ViewChild('nameInput', {static: false}) component : Component
Vous pouvez en lire davantage ici et ici
Angular 9 & Angular 10
Dans Angular 9, la valeur par défaut est static: false, donc il n'est pas nécessaire de fournir le paramètre à moins que vous ne vouliez utiliser {static: true}
Réponse #3
Dans Angular 8, ViewChild prend 2 paramètres :
Essayez comme ça :
@ViewChild('nameInput', { static: false }) nameInputRef: ElementRef;
Explication :
{ statique : faux }
Si vous définissez static false, le composant enfant est TOUJOURS initialisé après l'initialisation de la vue à temps pour les fonctions de rappel ngAfterViewInit/ngAfterContentInit.
{ statique : vrai }
Si vous définissez static true, l'initialisation du composant enfant aura lieu lors de l'initialisation de la vue à ngOnInit
Par défaut, vous pouvez utiliser { static: false }. Si vous créez une vue dynamique et que vous voulez utiliser la variable de référence du modèle, alors vous devriez utiliser { static: true }
Pour plus d'informations, vous pouvez lire cet article
Démo fonctionnelle
Dans la démo, nous allons faire défiler jusqu'à une div en utilisant une variable de référence de modèle.
@ViewChild("scrollDiv", { static: true }) scrollTo: ElementRef;
Avec { static: true }, nous pouvons utiliser this.scrollTo.nativeElement dans ngOnInit, mais avec { static: false }, this.scrollTo sera undefined dans ngOnInit, donc nous ne pouvons y accéder que dans ngAfterViewInit
