Podczas próby ViewChild pojawia się błąd. Błąd brzmi: „Nie podano argumentu„ opts ”.”
Zarówno @ViewChild podaje błąd.
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): błąd TS2554: Oczekiwano 2 argumentów, ale otrzymał 1.
angular
typescript
przepełnienie stosu
źródło
źródło
Odpowiedzi:
W Angular 8 ViewChild przyjmuje 2 parametry
źródło
{ static: true }
.ng update
pomoże ci to zrobić automatycznie w razie potrzeby. Lub, jeśli już zaktualizowałeś swoje zależności do Angular 8, to polecenie pomoże migrować kod:ng update @angular/core --from 7 --to 8 --migrate-only
true
, ale jeśli może poczekać do inicjacji, może byćfalse
, co oznacza, że nie będzie dostępny do ngAfterViewInit / ngAfterContentInit.Kątowy 8
W Angular 8 ViewChild ma inny parametr
Możesz przeczytać więcej o tym tutaj i tutaj
Kątowy 9
W
Angular 9
Domyślną wartością jeststatic: false
, więc nie ma potrzeby, aby zapewnić param chyba że chcesz używać{static: true}
źródło
@ContentChild('foo', {static: false}) foo !: ElementRef;
. Jestem ciekawy wykrzyknika. Czy to coś nowego w Angular 8?W Angular 8
ViewChild
przyjmuje 2 parametry:Spróbuj tak:
Wyjaśnienie:
Jeśli ustawisz wartość false na statyczną , komponent ZAWSZE zostanie zainicjowany po zainicjowaniu widoku w czasie dla
ngAfterViewInit/ngAfterContentInit
funkcji wywołania zwrotnego.Jeśli ustawisz wartość true true , inicjalizacja nastąpi przy inicjalizacji widoku o godzinie
ngOnInit
Domyślnie możesz użyć
{ static: false }
. Jeśli tworzysz widok dynamiczny i chcesz użyć zmiennej odwołania do szablonu, powinieneś użyć{ static: true}
Aby uzyskać więcej informacji, możesz przeczytać ten artykuł
W wersji demonstracyjnej przewijamy do div przy użyciu zmiennej odniesienia szablonu.
Dzięki
{ static: true }
, możemy użyćthis.scrollTo.nativeElement
wngOnInit
, ale{ static: false }
,this.scrollTo
będzieundefined
sięngOnInit
, więc mamy dostęp jedynie wngAfterViewInit
źródło
Dzieje się tak, ponieważ widok dziecka wymaga dwóch argumentów. Spróbuj tego
źródło
W Angular 8 ViewChild zawsze przyjmuje 2 parametry, a drugie parametry zawsze mają statyczny: prawda lub statyczny: fałsz
Możesz spróbować w ten sposób:
Ponadto,
static: false
będzie domyślnym zachowaniem awaryjna w kątowym 9.Co to jest statyczne fałsz / prawda: Z reguły można zastosować następujące zasady:
{ static: true }
należy ustawić, aby uzyskać dostęp do ViewChild w ngOnInit.{ static: false }
można uzyskać dostęp tylko w ngAfterViewInit. To jest również to, do czego chcesz się zastosować, gdy masz dyrektywę strukturalną (tj. * NgIf) na swoim elemencie w szablonie.źródło
Regex w celu zastąpienia wszystkich za pośrednictwem IDEA (testowane za pomocą Webstorm)
Odnaleźć:
\@ViewChild\('(.*)'\)
Zastąpić:
\@ViewChild\('$1', \{static: true\}\)
źródło
powinieneś użyć drugiego argumentu z ViewChild w następujący sposób:
źródło
Użyj tego
źródło
W Angular 8 ViewChild ma inny parametr
@ViewChild („nameInput”, {static: false}) składnik
Rozwiązałem problem jak poniżej
@ViewChild (MatSort, {static: false}) sortuj: MatSort;
źródło
To także rozwiązało mój problem.
źródło