Erreur @ViewChild () angulaire: 2 arguments attendus, mais 1 obtenu

249

Lorsque j'essaie ViewChild, j'obtiens l'erreur. L'erreur est "Un argument pour 'opts' n'a pas été fourni."

@ViewChild donne à la fois 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 obtenu.

débordement de pile
la source
Qu'est-ce qui est en ligne 11?
Tony Ngo
@TonyNgo @ViewChild ('nameInput') nameInputRef: ElementRef;
débordement de pile

Réponses:

497

Dans Angular 8, ViewChild prend 2 paramètres

 @ViewChild(ChildDirective, {static: false}) Component
Jensen
la source
9
pouvez-vous le marquer comme accepté? Depuis les documents angulaires: statique - s'il faut ou non résoudre les résultats de la requête avant l'exécution de la détection des modifications (c'est-à-dire renvoyer uniquement les résultats statiques). Si cette option n'est pas fournie, le compilateur reviendra à son comportement par défaut, qui consiste à utiliser les résultats de la requête pour déterminer le moment de la résolution de la requête. Si des résultats de requête se trouvent dans une vue imbriquée (par exemple * ngIf), la requête sera résolue après l'exécution de la détection des modifications. Sinon, il sera résolu avant l'exécution de la détection des modifications.
Jensen
12
Vous devriez ajouter cela à la réponse si vous voulez qu'il accepte votre réponse comme la meilleure
Sytham
14
Remarque: pour conserver le comportement que vous aviez dans Angular 7, vous devez spécifier { static: true }. ng updatevous aidera à le faire automatiquement si nécessaire. Ou, si vous avez déjà mis à jour vos dépendances vers Angular 8, cette commande vous aidera à migrer votre code:ng update @angular/core --from 7 --to 8 --migrate-only
evilkos
11
Si l'élément doit être disponible pendant ngOnInit, alors statique doit l'être true, mais s'il peut attendre après l'initialisation, il peut l'être false, ce qui signifie qu'il ne sera pas disponible jusqu'à ngAfterViewInit / ngAfterContentInit.
Armen Zakaryan
Je ne le savais pas. Merci. :-)
Tanzeel
84

Angulaire 8

Dans Angular 8, ViewChild a un autre paramètre

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

Vous pouvez en savoir plus ici et ici

Angulaire 9

La Angular 9valeur par défaut est static: falsedonc n'a pas besoin de fournir de paramètres sauf si vous souhaitez utiliser{static: true}

Reza
la source
Dans l'un des articles auxquels vous avez lié, ils affichent une syntaxe similaire @ContentChild('foo', {static: false}) foo !: ElementRef;. Je suis curieux de savoir le point d'exclamation. Est-ce aussi quelque chose de nouveau avec Angular 8?
Konrad Viltersten du
1
@KonradViltersten voir ce stackoverflow.com/a/56950936/2279488
Reza
26

Dans Angular 8, ViewChild prend 2 paramètres:

Essayez comme ceci:

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

Explication:

{statique: faux}

Si vous définissez statique false , le composant TOUJOURS est initialisé après l'initialisation de la vue à temps pour les ngAfterViewInit/ngAfterContentInitfonctions de rappel.

{statique: vrai}

Si vous définissez static true , l'initialisation 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 souhaitez utiliser la variable de référence du modèle, vous devez utiliser{ static: true}

Pour plus d'informations, vous pouvez lire cet article

Démo de travail

Dans la démo, nous allons faire défiler jusqu'à un div en utilisant la variable de référence du modèle.

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

Avec { static: true }, nous pouvons utiliser this.scrollTo.nativeElementdans ngOnInit, mais avec { static: false }, this.scrollTosera undefineddans ngOnInit, donc nous ne pouvons accéder qu'àngAfterViewInit

Adrita Sharma
la source
6

c'est parce que la vue enfant nécessite deux arguments, essayez comme ceci

@ViewChild ('nameInput', {statique: faux,}) nameInputRef: ElementRef;

@ViewChild ('amountInput', {statique: faux,}) amountInputRef: ElementRef;

paras shah
la source
3

Dans Angular 8, ViewChild prend toujours 2 paramètres et les seconds paramètres ont toujours statique: vrai ou statique: faux

Vous pouvez essayer comme ceci:

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

Également static: false va être le comportement de secours par défaut dans Angular 9.

Ce qui est statique faux / vrai: Donc, en règle générale, vous pouvez opter pour les éléments suivants:

  • { static: true } doit être défini lorsque vous souhaitez accéder à ViewChild dans ngOnInit.

    { static: false }n'est accessible que dans ngAfterViewInit. C'est aussi ce que vous voulez faire lorsque vous avez une directive structurelle (c'est-à-dire * ngIf) sur votre élément dans votre modèle.

Pinki Dhakad
la source
1

Regex pour remplacer tout via IDEA (testé avec Webstorm)

Trouver: \@ViewChild\('(.*)'\)

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

Torsten Simon
la source
1

vous devez utiliser un deuxième argument avec ViewChild comme ceci:

@ViewChild("eleDiv", { static: false }) someElement: ElementRef;
Hammad Ahmad
la source
1

Utilisez ceci

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

Dhilrukshan Pradeep
la source
0

Dans Angular 8, ViewChild a un autre paramètre

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

J'ai résolu mon problème comme ci-dessous

@ViewChild (MatSort, {statique: faux}) sort: MatSort;

user2660331
la source
-5

Cela a également résolu mon problème.

@ViewChild('map', {static: false}) googleMap;
Helmar Bachle
la source