Angular에서 수동으로 변경 감지 트리거


387

속성이있는 Angular 구성 요소를 작성하고 있습니다 Mode(): string.

이벤트에 응답하지 않고 프로그래밍 방식 으로이 속성을 설정할 수 있기를 바랍니다.

문제는 브라우저 이벤트 {{Mode}}가 없으면 템플릿 바인딩 이 업데이트되지 않는다는 것입니다.

이 변경 감지를 수동으로 트리거하는 방법이 있습니까?

답변:


640

다음 중 하나를 시도하십시오.

  • ApplicationRef.tick()-AngularJS와 유사합니다. $rootScope.$digest()즉, 전체 컴포넌트 트리를 확인하십시오.
  • NgZone.run(callback)- 유사 $rootScope.$apply(callback)- 즉, 각 영역 내부의 콜백 함수를 평가합니다. 나는 이것이 콜백 함수를 실행 한 후 전체 구성 요소 트리를 검사하게된다고 확신하지는 않습니다.
  • ChangeDetectorRef.detectChanges()-유사 $scope.$digest()-즉,이 컴포넌트와 그 하위 요소 만 확인

당신은 삽입 할 수 ApplicationRef, NgZone또는 ChangeDetectorRef구성 요소에.


1
고맙게도 변경 사항이 상당히 현지화되어 있기 때문에 모든 것을 확인하지 않기 위해 세 번째 솔루션을 선택했습니다. 시간이 더 있으면 다른 옵션을 조사해야합니다. 각 선택에 성능 관련이 있습니까?
jz87

36
일에 대한 ChangeDetectorRef.detectChanges(). 지시어가 입력 값을 업데이트하기 전에 유효성 검사기가 시작되었습니다.
ps2goat

7
ApplicationRef.tick () 및 ChangeDetectorRef.detectChanges ()는 여전히 2.0.0 final에 있습니다.
Max Mumford

51
내가 이것을 언급 할 것이라고 생각했습니다. 이들은 정적 메소드가 아니며 인스턴스 메소드입니다. 이러한 클래스를 서비스로 주입해야합니다.
Stephen Paul

1
ApplicationRef.tick ()는 FireFox v17 문제를 해결하는 데 도움이되었습니다 (<20)
Dan J

123

허용 된 답변 참조를 사용했으며 Angular 2 설명서를 읽기가 매우 어렵 기 때문에 예제를 작성하고 싶습니다.

  1. 수입 NgZone:

    import { Component, NgZone } from '@angular/core';
    
  2. 클래스 생성자에 추가

    constructor(public zone: NgZone, ...args){}
    
  3. 다음을 사용하여 코드를 실행하십시오 zone.run.

    this.zone.run(() => this.donations = donations)
    

6
zone.run코드를 어디에 두어야하며 정확히 무엇 donations입니까?
suku

@suku donations는 업데이트하려는 속성이므로 this.foo = bar가 될 수 있습니다. zone.run은 당신이 물건을 업데이트하려는 곳마다 간다.
Matthew 옵션 Meehan

4
이 솔루션을 사용하여 document.addEventListener ( "resume", callback)를 사용할 때보기 업데이트를 강제했습니다.
marcovtwout

71

markForCheck () 로 업데이트 할 수있었습니다.

ChangeDetectorRef 가져 오기

import { ChangeDetectorRef } from '@angular/core';

주입하고 인스턴스화

constructor(private ref: ChangeDetectorRef) { 
}

마지막으로 마크 변경 감지

this.ref.markForCheck();

다음은 markForCheck ()가 작동하고 detectChanges ()가 작동하지 않는 예입니다.

https://plnkr.co/edit/RfJwHqEVJcMU9ku9XNE7?p=preview

편집 :이 예제는 더 이상 문제를 묘사하지 않습니다 :( 문제가 해결 된 최신 Angular 버전을 실행하고 있다고 생각합니다.

(STOP / RUN을 눌러 다시 실행하십시오)


detectChanges ()의 시작점이 작동하지 않습니다. 동일한 문제를 발견했으며 변경 감지가 OnPush가 아닌 경우 작동한다는 것을 알았습니다. 그것에 대한 설명을 얻는 것이 좋을 것입니다 ...
Christian

2
이 플런저에서 detectChanges가 실제로 작동하는 것 같습니다. 뭔가 빠졌습니까?
Jared_C

1
ChangeDetectorRef는 구성 요소에서만 작동합니다.
kevinius

(!) 이것은 나쁜 예입니다. 죄송합니다. 예는 아무것도 표시하지 않습니다. 첫 번째 항목은 덮어 씁니다. 그냥 ... 타이머를 조금 조정
피터 Stegnar

이 예는 더 이상 문제를 묘사하지 않습니다 :( 나는 그것을 고정있어 새로운 각도 버전을 실행 할 수 있습니다 생각합니다.
누누 토마스

7

Angular 2+에서 @Input 데코레이터를 사용해보십시오

부모와 자식 구성 요소 사이에 좋은 속성 바인딩을 허용합니다.

먼저 부모에게 전역 변수를 생성하여 자식에게 전달 될 객체 / 속성을 담습니다.

그런 다음 자식에서 전역 변수를 만들어 부모에서 전달 된 개체 / 속성을 유지합니다.

그런 다음 하위 템플리트가 사용되는 상위 HTML에서 하위 변수 이름으로 대괄호 표기법을 추가 한 다음 상위 변수 이름과 동일하게 설정하십시오. 예:

<child-component-template [childVariable] = parentVariable>
</child-component-template>

마지막으로 자식 속성이 자식 구성 요소에 정의되어 있으면 입력 데코레이터를 추가하십시오.

@Input()
public childVariable: any

부모 변수가 업데이트되면 업데이트가 자식 구성 요소로 전달되어 html이 업데이트됩니다.

또한 자식 구성 요소에서 함수를 트리거하려면 ngOnChanges를 살펴보십시오.


2
당신이 ... 부모에 업데이트 exmaple 정적 방법 "참조"업데이트되며 변경 감지 었소가 발생으로 아이를 데리러 실 거예요 말할 경우 NO ... 문제 이잖아
Bhail

나는 며칠 동안 같은 문제를 겪었다. PHP 백엔드에서 데이터를 검색하려고하는데 데이터가 전혀 업데이트되지 않습니다. Microsoft Edge에서는 제대로 작동하지만 다른 브라우저에서는 작동하지 않습니다. 처음 시작한 데이터를 계속 가져 오지만 데이터가 변경되면보기에 업데이트되지 않습니다.
el6976

1

ChangeDetectorRef.detectChanges ()-$ scope. $ digest ()와 유사합니다. 즉,이 구성 요소와 해당 하위 항목 만 확인하십시오.

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