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.