Angular 8에서 @ViewChild에 대한 새로운 정적 옵션을 어떻게 사용해야합니까?
새로운 Angular 8 뷰 자식을 어떻게 구성해야합니까?
@ViewChild('searchText', {read: ElementRef, static: false})
public searchTextInput: ElementRef;
vs
@ViewChild('searchText', {read: ElementRef, static: true})
public searchTextInput: ElementRef;
어떤게 더 좋아? 언제 static:true
vs를 사용해야 static:false
합니까?
대부분의 경우 {static: false}
. 이렇게 설정하면 바인딩 해결 (구조적 지시문 등 *ngIf, etc...
) 에 의존하는 쿼리 일치를 찾을 수 있습니다.
사용 예 static: false
:
@Component({
template: `
<div *ngIf="showMe" #viewMe>Am I here?</div>
<button (click)="showMe = !showMe"></button>
`
})
export class ExampleComponent {
@ViewChild('viewMe', { static: false })
viewMe?: ElementRef<HTMLElement>;
showMe = false;
}
은 static: false
더 각도 9. 읽기의 기본 대체 동작 될 것입니다 여기 와 여기에
이 { static: true }
옵션은 즉시 내장 된 뷰 생성을 지원하기 위해 도입되었습니다. 뷰를 동적으로 생성하고에 액세스하려는 경우 오류 가 발생 TemplateRef
하므로에서 그렇게 할 수 없습니다 . 정적 플래그를 true로 설정하면 ngOnInit에 뷰가 생성됩니다.ngAfterViewInit
ExpressionHasChangedAfterChecked
그렇지만:
대부분의 다른 경우에 가장 좋은 방법은
{static: false}
.
이 { static: false }
옵션은 Angular 9에서 기본으로 설정 static: true
됩니다. 이는 옵션 을 사용하지 않는 한 더 이상 정적 플래그를 설정할 필요가 없음을 의미합니다 .
angular cli ng update
명령을 사용 하여 현재 코드베이스를 자동으로 업그레이드 할 수 있습니다 .
마이그레이션 가이드 및 이에 대한 자세한 정보는 여기 에서 확인할 수 있습니다.
따라서 경험적으로 다음을 수행 할 수 있습니다.
{ static: true }
당신이 액세스 할 때 요구 설정을 할 수ViewChild
있는가ngOnInit
.{ static: false }
에서만 액세스 할 수 있습니다ngAfterViewInit
. 이것은 또한*ngIf
템플릿의 요소에 구조적 지시문 (예 :)이있을 때 원하는 것입니다 .
각도 문서에서
static- 변경 감지가 실행되기 전에 쿼리 결과를 해결할지 여부 (예 : 정적 결과 만 반환). 이 옵션이 제공되지 않으면 컴파일러는 쿼리 결과를 사용하여 쿼리 해결 타이밍을 결정하는 기본 동작으로 돌아갑니다. 쿼리 결과가 중첩 된 뷰 (예 : * ngIf) 내에있는 경우 변경 검색이 실행 된 후 쿼리가 해결됩니다. 그렇지 않으면 변경 감지가 실행되기 전에 해결됩니다.
static:true
아이가 어떤 조건에도 의존하지 않는 경우 사용하는 것이 더 좋은 생각 일 수 있습니다 . 요소의 가시성이 변경되면 static:false
더 나은 결과를 얻을 수 있습니다.
추신 : 새로운 기능이므로 성능 벤치 마크를 실행해야 할 수도 있습니다.
편집하다
@Massimiliano Sartoretto가 언급했듯이 github 커밋 은 더 많은 통찰력을 제공 할 수 있습니다.
Angular 8로 업그레이드 한 후 ngOnInit에서 ViewChild가 null이기 때문에 여기에 왔습니다.
정적 쿼리는 ngOnInit 전에 채워지고 동적 쿼리 (static : false)는 이후에 채워집니다. 즉, static : false를 설정 한 후 ngOnInit에서 viewchild가 이제 null이면 static : true로 변경하거나 코드를 ngAfterViewInit로 이동해야합니다.
참조 https://github.com/angular/angular/blob/master/packages/core/src/view/view.ts#L332-L336를
The other answers are correct and explain why this is the case: Queries dependant on structural directives, e.g. a ViewChild reference inside an ngIf, should run after the conditional of this directive has been resolved, ie after change detection. However, one may safely use static: true and thus resolve the queries before ngOnInit for unnested references. Imho this particular case bears mentioning as a null exception could likely be the first way you'll encounter this particularity, as it was for me.
'Programing' 카테고리의 다른 글
Django 1.7 및 데이터 마이그레이션으로 초기 데이터로드 (0) | 2020.09.04 |
---|---|
Array.prototype.includes 대 Array.prototype.indexOf (0) | 2020.09.04 |
SQLite에서 테이블을 조인하는 동안 어떻게 업데이트합니까? (0) | 2020.09.04 |
JPA와 Hibernate를 사용할 때 어떻게 같고 해시 코드를 구현해야 하는가 (0) | 2020.09.04 |
자바 스크립트 배열 맵 메서드의 Break 문 (0) | 2020.09.04 |