2016-07-08 2 views
0

ngFor에서 전달 된 입력 속성의 중요한 변경 사항을 DoCheck가 감지하는 데 사용합니다. 정상적으로 작동합니다. 그러나 일부 변경 (ngFor에 의해 반복되는 배열에서 하나의 항목 제거) 할 때 내 자식 구성 요소는 변경 사항을 보지 않고 자체 렌더링하지 않습니다.DoCheck 이후 각도 2 입력 특성 변경이 각도로 감지되지 않음

내가 뭔가 잘못했을 수 있습니까?

ngDoCheck() { 
    console.log('zz'); 
    var changes = this._differ.diff(this.schedulerData); 
    console.log(changes); 
    if(changes) { 
     changes.forEachAddedItem(r => { 
      console.log(r); 
      if (r.key === 'tasks') this.launchScheduler(); 
     }); 
    } 
} 

ngOnInit() { 
     console.log(this.schedulerData); 

    } /* !ngOnInit */ 


ngOnChanges(changes: {[propertyName: string]: SimpleChange}) { 

    for (let propName in changes) { 
    if (propName === 'schedulerData') { 
console.log(changes[propName]); 

    } 
    } 
} 
+0

배열을 변경할 때 변경 사항이 반영되지 않는 문제입니까? –

+0

예. 배열 항목이 있고 * ngFor를 통해 반복합니다. 이 ngFor에서 나는 자식 구성 요소 (위에서 볼 수있는 코드)를 가지고 있으며 정상적으로 작동합니다. 그러나이 항목의 길이를 변경하면 DoCheck (* ngFor re-iterate correct)와 같은 자식 구성 요소가 정상적으로 다시 렌더링되지 않지만 구성 요소가 OnInit 등을 실행하지 않습니다. 이유 및 이유를 이해하지 못합니다. 내가 어떻게 이걸로 싸울 수 있는지. – Velidan

답변

2

변경 감지는 기본적으로 개체 또는 배열 내의 업데이트를 검색하지 않지만 개체 참조가 변경 될 때 수행합니다.

이 동작을 무시하려면 올바른 방법으로 ngDoCheck을 사용하십시오. 귀하의 경우, 그것은 정상적인 동작입니다 :이 기본 변경 검출기에 의해 트리거 것 때문에 ngOnChanges 방법은 호출되지 않습니다 당신은 IterableDiffers 클래스

  • 을 활용 ngDoCheck 방법에서 배열 업데이트를 듣고

    • (즉, 물체를 감지 참조 변경). 지시문은 일반적으로 동일한 입력에 변화에 대응하기 위해 DoCheck 및 OnChanges을 모두 사용하지 않도록

      참고 : 문서에서 정보를 그렇지 않으면

    . ngOnChanges는 기본 변경 감지기가 변경 사항을 감지 할 때 계속 호출되므로 두 후크 모두에서 동일한 입력에 대한 변경 사항에 응답 할 필요가 없습니다. 변경 사항에 대한 반응은 ngDoCheck 콜백 내에서 처리되어야합니다.

  • 2

    배열을 추가하거나 제거 할 때 변경 감지가 트리거되지 않습니다. 배열 참조가 변경되지 않기 때문입니다. (따라서 무언가를 추가하거나 무언가를 제거하는 것은 변경 감지에 따라 배열을 "변경"하지 않습니다).

    변경 감지에 이러한 변경 사항을 알리려면 배열에 대한 참조를 변경해야합니다. 예를 들어, 내가 생각할 수있는 가장 쉬운 방법은 배열에 array.slice을 사용하는 것입니다. 이 메소드 호출은 새로운 배열을 반환합니다. 이전 배열을 할당하면 새로운 참조가 생기고 변경 감지가이를 알 수 있습니다.

    +0

    답변 해 주셔서 감사합니다. 하지만 새 화식을 설정했습니다 * this.schedulersData = [this.schedulersData [schedIndex]] *. 변경 감지를 시작해야합니다. NgFor는 올바르게 렌더링하지만 구성 요소는 ngOnInit 자체를 트리거하지 않습니다. – Velidan

    +0

    그래, 슬라이스로 날 위해 노력하고있어. –

    관련 문제