4

map/reduce 함수 나 깊게 중첩 된 접근 자처럼 다이제스트주기 당 데이터를 캐시해야하는 경우가 자주 있습니다. 이를 위해 다이제스트 루프 전후에 캐시 된 값을 지우려면 다이제스트 콜백을 설정하는 것이 좋습니다. 이것을 달성하기위한 "각 방향"이 있습니까?AngularJS 다이제스트 콜백

답변

8

$rootScope.$watch으로 할 수있는 한 가지는 "리스너"가없는 함수입니다 (아무 것도 반환하지 않는 함수 하나만 사용하십시오). 이렇게하면 다이제스트가 발생할 때 제공된 함수를 통해 효과적으로 알릴 수 있습니다.

$rootScope.$watch(function() { 
    // a digest is happening. 
}); 

주기마다이 수신기는 두 번 호출되지만 해킹없이 시작 또는 종료하는지 여부를 알 수 없습니다. 그래서 플래그를 사용하여 우리가 어떤 상태에 있는지 추적 할 수 있으며, 다이제스트가 소화되지 않은 상태로 전환 할 때 캐시를 지울 수 있습니다. In this example, 나는 단지 $cacheFactory을 사용하여 캐시를 생성하는 서비스를 만들지 만 그 상태를 추적하고 적절한 시간에이를 지 웁니다.

내 생기있는보기에서 그럴듯 해 보입니다. 그러나 방망이에서 벗어나 다이제스트 캐시가 조기에 삭제 될 수있는 문제가 발생합니다. 예를 들어, watch 명령문이 이후에 지워지는 예제의 콘솔 메시지에서이를 확인할 수 있습니다. 이는 내 서비스에 추가 된 시계가 마지막에 오도록 시계의 순서를 제어 할 수 없기 때문입니다.

그러나 소스를 $rootScope으로 보면 문서화되지 않은 내부 함수 $$postDigest이 표시됩니다.이 함수는 다이제스트가 완료 될 때 처리되는 대기열에 일부 기능을 추가합니다. 따라서 동일한 기술을 사용할 수 있지만 this example에서 볼 수 있듯이 $$postDigest을 사용하여 정리를 연기 할 수 있습니다. 작동하지만 얇은 얼음을 내부 API로 재생합니다. 스스로 위험을 감수하십시오.

관련 문제