각도 @ViewChild () 오류 : 2 개의 인수가 필요하지만 1 개가 있음


249

ViewChild를 시도 할 때 오류가 발생합니다. 오류는 " 'opts'에 대한 인수가 제공되지 않았습니다."입니다.

@ViewChild 모두 오류가 발생했습니다.

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) : 오류 TS2554 : 2 개의 인수를 예상했지만 1을 받았습니다.


11 행은 무엇입니까?
Tony Ngo 2016 년

@TonyNgo @ViewChild ( 'nameInput') nameInputRef : ElementRef;
stack overflow

답변:


497

Angular 8에서 ViewChild는 2 개의 매개 변수를 사용합니다.

 @ViewChild(ChildDirective, {static: false}) Component

9
허용 된 것으로 표시 할 수 있습니까? Angular 문서에서 : static-변경 감지가 실행되기 전에 쿼리 결과를 해결할지 여부 (정적 결과 만 반환). 이 옵션을 제공하지 않으면 컴파일러는 쿼리 결과를 사용하여 쿼리 해결 타이밍을 결정하는 기본 동작으로 돌아갑니다. 쿼리 결과가 중첩 된 뷰 안에 있으면 (예 : * ngIf) 변경 감지 실행 후 쿼리가 해결됩니다. 그렇지 않으면 변경 감지가 실행되기 전에 해결됩니다.
Jensen

12
당신이 그를 최고의 답변으로 받아들이 길 원한다면 답변에 추가해야합니다
Sytham

14
참고 : Angular 7에서 동작을 유지하려면을 지정해야합니다 { static: true }. ng update필요한 경우 자동으로이 작업을 수행하는 데 도움이됩니다. 또는 종속성을 Angular 8로 이미 업그레이드 한 경우이 명령은 코드를 마이그레이션하는 데 도움이됩니다.ng update @angular/core --from 7 --to 8 --migrate-only
evilkos

11
ngOnInit 중에 요소를 사용할 수 있어야하는 경우 static은이어야 true하지만 초기화 후까지 기다릴 수있는 false경우 ngAfterViewInit / ngAfterContentInit까지 사용할 수 없습니다.
Armen Zakaryan

나는 몰랐다. 감사. :-)
Tanzeel

84

앵귤러 8

Angular 8에서 ViewChild에는 다른 매개 변수가 있습니다.

@ViewChild('nameInput', {static: false}) component

여기여기에 대해 더 자세히 읽을 수 있습니다

앵귤러 9

에서 Angular 9기본값입니다 static: false, 그래서 당신은 사용하지 않으려면 PARAM를 제공 할 필요가 없습니다{static: true}


링크 한 기사 중 하나에서 다음과 같은 구문을 보여줍니다 @ContentChild('foo', {static: false}) foo !: ElementRef;. 느낌표가 궁금합니다. Angular 8에서도 새로운 것이 있습니까?
Konrad Viltersten

1
@KonradViltersten 참조 this stackoverflow.com/a/56950936/2279488
Reza

26

Angular 8에서는 ViewChild두 가지 매개 변수를 사용합니다.

이렇게 해보십시오 :

@ViewChild('nameInput', { static: false }) nameInputRef: ElementRef;

설명:

{정적 : 거짓}

static false 를 설정 하면 ngAfterViewInit/ngAfterContentInit콜백 함수에 대한 뷰 초기화 시간이 지나면 컴포넌트 ALWAYS가 항상 초기화됩니다 .

{정적 : true}

static true로 설정 하면 초기화는 다음 위치의 뷰 초기화에서 수행됩니다.ngOnInit

기본적으로을 사용할 수 있습니다 { static: false }. 동적 뷰를 작성 중이고 템플리트 참조 변수를 사용하려면 다음을 사용해야합니다.{ static: true}

자세한 내용은이 기사를 읽을 수 있습니다

실무 데모

데모에서는 템플릿 참조 변수를 사용하여 div로 스크롤합니다.

 @ViewChild("scrollDiv", { static: true }) scrollTo: ElementRef;

함께 { static: true }, 우리가 사용할 수 this.scrollTo.nativeElement있는 ngOnInit,하지만 함께 { static: false }, this.scrollTo될 것입니다 undefined에서 ngOnInit우리는 단지에에 액세스 할 수 있도록,ngAfterViewInit


6

뷰 자식이 두 가지 인수를 요구하기 때문에

@ViewChild ( 'nameInput', {static : false,}) nameInputRef : ElementRef;

@ViewChild ( 'amountInput', {정적 : false,}) amountInputRef : ElementRef;


3

Angular 8에서 ViewChild는 항상 2 개의 매개 변수를 취하고 두 번째 매개 변수에는 항상 정적 : true 또는 정적 : false가 있습니다.

다음과 같이 시도해보십시오.

@ViewChild('nameInput', {static: false}) component

또한 static: falseAngular 9의 기본 폴백 동작이 될 것입니다.

정적 거짓 / 참인 것 : 경험적으로 볼 때 다음을 수행 할 수 있습니다.

  • { static: true } ngOnInit에서 ViewChild에 액세스하려면 설정해야합니다.

    { static: false }ngAfterViewInit에서만 액세스 할 수 있습니다. 템플릿의 요소에 구조적 지시문 (예 : * ngIf)이있는 경우에도 원하는 결과입니다.


1

IDEA를 통한 모든 교체를위한 정규식 (Webstorm으로 테스트)

찾기: \@ViewChild\('(.*)'\)

바꾸다: \@ViewChild\('$1', \{static: true\}\)


1

다음과 같이 ViewChild에 두 번째 인수를 사용해야합니다.

@ViewChild("eleDiv", { static: false }) someElement: ElementRef;


0

Angular 8에서 ViewChild에는 다른 매개 변수가 있습니다.

@ViewChild ( 'nameInput', {static : false}) 구성 요소

아래처럼 내 문제를 해결했습니다.

@ViewChild (MatSort, {static : false}) 정렬 : MatSort;


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.