2017-01-23 1 views
0

구성 요소 간의 변경 감지 및 데이터 흐름과 관련된 Angular2 (최종) 문제가 있습니다. 나는 그 주위를 돌아 다녔다. 그러나 나에게 조금 해키처럼 보일 것이다. 그래서 그것을하는 더 좋은 방법이 있는지 궁금하게 생각하고 있었다. 기본적으로Angular2 변경 감지 "확인 된 후에 표현식이 변경되었습니다."

그 부모 구성 요소에서 처리 정의 된 @Output가 모든 구성 요소 C의 아이 요소의 수 C.

를 생성 * ngFor 또한 하위 구성 요소 B와이있는 구성 요소 A가 A의 각 인스턴스에 대해 A 출력을 기반으로 구성 요소 A의 다른 속성이 결정되고 (숫자 만) 구성 요소 B에서 @Input으로 사용됩니다.

DEV 모드에서 구성 요소 C의 @Output이 트리거 될 때마다 콘솔 아래에 오류가 있습니다.

Expression has changed after it was checked. Previous value: XX. Current value: XX. 

Angular2에서 단방향 데이터 흐름으로 인해 예상되는 종류입니다. 내 시나리오에서 제대로 작동하게하는 방법을 궁금해?

나는 일시적으로 부품 A에 ChangeDetectorRef을 주입 나는 매우 효율적이지 상점이 걱정 C. 의 인스턴스에서 @Output 이벤트를 처리하는 기능에 자사의 detectChanges() 메소드를 호출합니다. 아마 그것을 향상시키고 마지막 항목의 이벤트 (모든 C 구성 요소가 동시에 해당 이벤트를 보냄) 후에 만 ​​호출 할 수는 있지만 이벤트의 비동기 성질과 예상치 못한 동작에 대해 걱정할 것입니다.

누구든지이 문제를 해결하는 방법을 알고 있습니까? 내 디자인은 구성 요소 간의 데이터 흐름면에서 근본적으로 결함이 있습니까? 공유 서비스 대신 데이터를 교환해야합니까?

도움을 주시면 감사하겠습니다.

+0

변경 감지 실행으로 인해 모델이 변경되면 오류가 발생합니다. 예를 들어 변경 감지에 의해 호출되는'ngOnChanges()'에서 모델을 변경하는 경우. 원인을 추적하는 데 더 많은 코드가 필요합니다. 종종 함수가 호출 될 때마다 새로운 객체 인스턴스를 반환하는 함수가 바인딩 될 때 발생합니다. –

+0

@ Günter Zöchbauer 그런 일이 생깁니다. 구성 요소 C의 모든 인스턴스에는 부모 구성 요소 A에서 모델 변경 결과가 발생하는 ngOnChanges()가 있습니다. 따라서 피하는 것이 좋습니다. – Zyga

답변

4

당신은 private cdRef:ChangeDetectorRef를 삽입 할 수 있으며 ngOnChanges()의 끝에서 this.cdRef.detectChanges()를 호출합니다. 이렇게 Angular run은 감지를 다시 변경하고 이전에 수정 된 모델 값에 대해 불평하지 않습니다.

class MyComponent { 
    constructor(private cdRef:ChangeDetectorRef) {} 

    ngOnChanges(changes) { 
    this.xxx = ... 
    ... 
    this.cdRef.detectChanges(); 
    } 
} 
+0

내 경우에는 ngOnChanges에서 컴포넌트 A의 하위 항목에서 발생하고 컴포넌트 A의 다른 하위 B의 값을 변경하면 작동하지 않을 수 있습니다 (이벤트를 A로 다시 보내고 관련 속성을 업데이트 함). 자녀 B의 입력으로 사용). 그러나 그것은 C에서받은 이벤트를 처리하는 구성 요소의 A 메서드에서 작동 할 것입니다. 저는 Angular2에서 "hacky"라고 생각하고 구성 요소 사이에 데이터를 전달하는 방식을 재고해야한다고 생각했습니다. – Zyga

+0

보통 관찰 가능 서비스와 공유 서비스를 사용하는 것이 좋습니다. Observables는 변경 감지와 관련한 이류를 유발하지 않습니다. –

관련 문제