Beim Versuch mit ViewChild wird der Fehler angezeigt. Fehler ist "Ein Argument für 'opts' wurde nicht angegeben."
Beide @ViewChild geben den Fehler aus.
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): Fehler TS2554: 2 Argumente erwartet, aber 1 erhalten.
angular
typescript
Paketüberfluss
quelle
quelle
Antworten:
In Angular 8 akzeptiert ViewChild zwei Parameter
quelle
{ static: true }
.ng update
hilft Ihnen dabei, dies bei Bedarf automatisch zu tun. Oder wenn Sie Ihre Abhängigkeiten bereits auf Angular 8 aktualisiert haben, hilft dieser Befehl bei der Migration Ihres Codes:ng update @angular/core --from 7 --to 8 --migrate-only
true
, aber wenn es bis nach dem Init warten kannfalse
, kann es sein , was bedeutet, dass es erst ngAfterViewInit / ngAfterContentInit verfügbar sein wird.Winkel 8
In Angular 8 verfügt ViewChild über einen weiteren Parameter
Hier und hier können Sie mehr darüber lesen
Winkel 9
Der
Angular 9
Standardwert iststatic: false
, muss also keinen Parameter angeben, es sei denn, Sie möchten verwenden{static: true}
quelle
@ContentChild('foo', {static: false}) foo !: ElementRef;
. Ich bin gespannt auf das Ausrufezeichen. Ist das auch bei Angular 8 etwas Neues?In Winkel 8
ViewChild
2 Parameter verwendet:Versuchen Sie es so:
Erläuterung:
Wenn Sie static false festlegen , wird die Komponente IMMER nach der Ansichtsinitialisierung rechtzeitig für die
ngAfterViewInit/ngAfterContentInit
Rückruffunktionen initialisiert .Wenn Sie static true setzen , erfolgt die Initialisierung bei der Ansichtsinitialisierung um
ngOnInit
Standardmäßig können Sie verwenden
{ static: false }
. Wenn Sie eine dynamische Ansicht erstellen und die Vorlagenreferenzvariable verwenden möchten, sollten Sie diese verwenden{ static: true}
Weitere Informationen finden Sie in diesem Artikel
In der Demo werden wir mithilfe der Vorlagenreferenzvariablen zu einem div scrollen.
Mit
{ static: true }
, können wir verwendenthis.scrollTo.nativeElement
inngOnInit
, aber mit{ static: false }
,this.scrollTo
wirdundefined
inngOnInit
, so dass wir nur Zugriff auf inngAfterViewInit
quelle
Dies liegt daran, dass View Child zwei Argumente benötigt. Versuchen Sie es wie folgt
quelle
In Angular 8 akzeptiert ViewChild immer 2 Parameter, und zweite Parameter haben immer static: true oder static: false
Sie können Folgendes versuchen:
Außerdem
static: false
wird dies das Standard-Fallback-Verhalten in Angular 9 sein.Was sind statisch falsch / wahr? Als Faustregel können Sie also Folgendes wählen:
{ static: true }
muss festgelegt werden, wenn Sie in ngOnInit auf ViewChild zugreifen möchten.{ static: false }
kann nur in ngAfterViewInit zugegriffen werden. Dies ist auch das, was Sie tun möchten, wenn Sie eine strukturelle Direktive (dh * ngIf) für Ihr Element in Ihrer Vorlage haben.quelle
Regex zum Ersetzen aller über IDEA (getestet mit Webstorm)
Finden:
\@ViewChild\('(.*)'\)
Ersetzen:
\@ViewChild\('$1', \{static: true\}\)
quelle
Sie sollten das zweite Argument mit ViewChild wie folgt verwenden:
quelle
Benutze das
quelle
In Angular 8 verfügt ViewChild über einen weiteren Parameter
@ ViewChild-Komponente ('nameInput', {static: false})
Ich habe mein Problem wie folgt gelöst
@ViewChild (MatSort, {static: false}) sort: MatSort;
quelle
Das hat auch mein Problem gelöst.
quelle