When trying viewchild i am getting the error. error is "An argument for 'opts' was not provided."
Both @ViewChild is giving the 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: Expected 2 arguments, but got 1.
In Angular 8 , ViewChild takes 2 parameters
it is because view child require two argument try like this
That also resolved my issue.
In Angular 8, ViewChild has another param
You can read more about it here and here
In Angular 8 ,
ViewChild
takes 2 parameters:Try like this:
Explanation:
If you set static false, the component ALWAYS gets initialized after the view initialization in time for the
ngAfterViewInit/ngAfterContentInit
callback functions.If you set static true, the initialization will take place at the view initialization at
ngOnInit
By default you can use
{ static: false }
. If you are creating a dynamic view and want to use the template reference variable, then you should use{ static: true}
For more info, you can read this article
In the demo, we will scroll to a div using template reference variable.
With
{ static: true }
, we can usethis.scrollTo.nativeElement
inngOnInit
, but with{ static: false }
,this.scrollTo
will beundefined
inngOnInit
, so we can access in only inngAfterViewInit