Errore angolare @ViewChild (): previsti 2 argomenti, ma ottenuto 1


249

Quando provo ViewChild ottengo l'errore. L'errore è "Non è stato fornito un argomento per 'opts'."

Entrambi @ViewChild sta dando l'errore.

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): errore TS2554: previsti 2 argomenti, ma ottenuto 1.


Cosa c'è nella riga 11?
Tony Ngo,

@TonyNgo @ViewChild ('nameInput') nameInputRef: ElementRef;
overflow dello stack

Risposte:


497

In Angular 8, ViewChild accetta 2 parametri

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

9
puoi per favore contrassegnarlo come accettato? Da documenti angolari: statico - se risolvere o meno i risultati della query prima dell'esecuzione del rilevamento delle modifiche (ovvero restituire solo risultati statici). Se questa opzione non viene fornita, il compilatore tornerà al suo comportamento predefinito, ovvero utilizzare i risultati della query per determinare i tempi della risoluzione della query. Se i risultati di una query si trovano all'interno di una vista nidificata (ad es. * NgIf), la query verrà risolta dopo l'esecuzione del rilevamento delle modifiche. In caso contrario, verrà risolto prima dell'esecuzione del rilevamento delle modifiche.
Jensen,

12
Dovresti aggiungerlo alla risposta se vuoi che accetti la tua risposta come la migliore
Sytham

14
Nota: per mantenere il comportamento che hai avuto in Angular 7, devi specificare { static: true }. ng updateti aiuterà a farlo automaticamente dove necessario. Oppure, se hai già aggiornato le tue dipendenze su Angular 8, questo comando ti aiuterà a migrare il tuo codice:ng update @angular/core --from 7 --to 8 --migrate-only
evilkos

11
Se l'elemento deve essere disponibile durante ngOnInit, allora deve essere statico true, ma se può attendere fino a dopo l'init può essere false, il che significa che non sarà disponibile fino a ngAfterViewInit / ngAfterContentInit.
Armen Zakaryan,

Non lo sapevo. Grazie. :-)
Tanzeel

84

Angolare 8

In Angular 8, ViewChild ha un altro parametro

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

Puoi leggere di più qui e qui

Angolare 9

Nel Angular 9valore predefinito è static: false, quindi non è necessario fornire param se non si desidera utilizzare{static: true}


In uno degli articoli a cui sei collegato, mostrano una sintassi simile @ContentChild('foo', {static: false}) foo !: ElementRef;. Sono curioso del punto esclamativo. È qualcosa di nuovo anche con Angular 8?
Konrad Viltersten,

1
@KonradViltersten vedere questo stackoverflow.com/a/56950936/2279488
Reza

26

In Angular 8, ViewChildaccetta 2 parametri:

Prova in questo modo:

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

Spiegazione:

{statico: falso}

Se si imposta statico false , il componente SEMPRE viene inizializzato dopo l'inizializzazione della vista in tempo per le ngAfterViewInit/ngAfterContentInitfunzioni di callback.

{statico: vero}

Se si imposta statico true , l'inizializzazione avrà luogo all'inizializzazione della vista inngOnInit

Di default puoi usare { static: false }. Se si sta creando una vista dinamica e si desidera utilizzare la variabile di riferimento del modello, è necessario utilizzare{ static: true}

Per maggiori informazioni, puoi leggere questo articolo

Demo di lavoro

Nella demo, scorreremo fino a un div usando la variabile di riferimento del modello.

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

Con { static: true }, possiamo usare this.scrollTo.nativeElementin ngOnInit, ma con { static: false }, this.scrollTosarà undefinedin ngOnInit, quindi possiamo accedere solo angAfterViewInit


6

è perché view child richiede due argomenti: prova in questo modo

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

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


3

In Angular 8, ViewChild accetta sempre 2 parametri e il secondo parametro ha sempre statico: vero o statico: falso

Puoi provare così:

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

Inoltre, static: falsesarà il comportamento di fallback predefinito in Angular 9.

Cosa sono statici false / true: Quindi, come regola generale, puoi scegliere quanto segue:

  • { static: true } deve essere impostato quando si desidera accedere a ViewChild in ngOnInit.

    { static: false }è possibile accedere solo in ngAfterViewInit. Questo è anche ciò che vuoi fare quando hai una direttiva strutturale (cioè * ngIf) sul tuo elemento nel tuo modello.


1

Regex per la sostituzione di tutto tramite IDEA (testato con Webstorm)

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

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


1

dovresti usare il secondo argomento con ViewChild in questo modo:

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


0

In Angular 8, ViewChild ha un altro parametro

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

Ho risolto il mio problema come di seguito

@ViewChild (MatSort, {static: false}) ordina: MatSort;


-5

Ciò ha anche risolto il mio problema.

@ViewChild('map', {static: false}) googleMap;
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.