Al intentar ViewChild obtengo el error. El error es "No se proporcionó un argumento para 'opts'".
Tanto @ViewChild está dando el error.
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): error TS2554: Se esperaban 2 argumentos, pero obtuve 1.
angular
typescript
desbordamiento de pila
fuente
fuente
Respuestas:
En Angular 8, ViewChild toma 2 parámetros
fuente
{ static: true }
.ng update
le ayudará a hacer esto automáticamente donde sea necesario. O, si ya ha actualizado sus dependencias a Angular 8, este comando lo ayudará a migrar su código:ng update @angular/core --from 7 --to 8 --migrate-only
true
, pero si puede esperar hasta después del inicio, puede estarlofalse
, lo que significa que no estará disponible hasta ngAfterViewInit / ngAfterContentInit.Angular 8
En Angular 8, ViewChild tiene otro parámetro
Puedes leer más sobre esto aquí y aquí
Angular 9
El
Angular 9
valor predeterminado esstatic: false
, por lo que no necesita proporcionar parámetros a menos que desee usar{static: true}
fuente
@ContentChild('foo', {static: false}) foo !: ElementRef;
. Tengo curiosidad por el signo de exclamación. ¿Es algo nuevo con Angular 8 también?En Angular 8,
ViewChild
toma 2 parámetros:Intenta así:
Explicación:
Si establece false estático , el componente SIEMPRE se inicializa después de la inicialización de la vista a tiempo para las
ngAfterViewInit/ngAfterContentInit
funciones de devolución de llamada.Si establece true estático , la inicialización tendrá lugar en la inicialización de la vista en
ngOnInit
Por defecto puedes usar
{ static: false }
. Si está creando una vista dinámica y desea usar la variable de referencia de plantilla, entonces debe usar{ static: true}
Para más información, puedes leer este artículo
En la demostración, nos desplazaremos a un div usando la variable de referencia de plantilla.
Con
{ static: true }
, podemos usarthis.scrollTo.nativeElement
enngOnInit
, pero con{ static: false }
,this.scrollTo
estaráundefined
enngOnInit
, por lo que podemos acceder solo enngAfterViewInit
fuente
es porque ver hijo requiere dos argumentos intente así
fuente
En Angular 8, ViewChild siempre toma 2 parámetros, y el segundo parámetro siempre tiene static: true o static: false
Puedes intentarlo así:
Además,
static: false
será el comportamiento de reserva predeterminado en Angular 9.Qué es estático falso / verdadero: por lo tanto, como regla general, puede elegir lo siguiente:
{ static: true }
debe configurarse cuando desee acceder a ViewChild en ngOnInit.{ static: false }
solo se puede acceder en ngAfterViewInit. Esto también es lo que desea utilizar cuando tiene una directiva estructural (es decir, * ngIf) en su elemento en su plantilla.fuente
Regex para reemplazar todo a través de IDEA (probado con Webstorm)
Encontrar:
\@ViewChild\('(.*)'\)
Reemplazar:
\@ViewChild\('$1', \{static: true\}\)
fuente
deberías usar el segundo argumento con ViewChild así:
fuente
Utilizar este
fuente
En Angular 8, ViewChild tiene otro parámetro
Componente @ViewChild ('nameInput', {static: false})
Resolví mi problema como a continuación
@ViewChild (MatSort, {static: false}) sort: MatSort;
fuente
Eso también resolvió mi problema.
fuente