Programing

디렉티브 테스트에서 $ apply 대 $ digest

crosscheck 2020. 8. 25. 07:32
반응형

디렉티브 테스트에서 $ apply 대 $ digest


범위에있는 특정 속성의 상태에 응답하는 지시문이 있고 테스트에서 해당 속성을 변경하고 올바르게 응답하는지 확인하려는 경우 변경을 수행하는 가장 좋은 방법은 무엇입니까?

이 두 패턴을 모두 보았습니다.

scope.$apply(function() {
    scope.myAttribute = true;
});

scope.myAttribute = true;
scope.$digest();

그들 사이의 차이점은 무엇이며 어떤 것이 더 낫고 그 이유는 무엇입니까?


scope.$digest()현재 범위와 모든 하위 항목에서도 감시자를 발사합니다. scope.$apply전달 된 함수를 평가하고 $rootScope.$digest().

첫 번째는 현재 범위와 그 하위에 대한 감시자를 평가해야하기 때문에 더 빠릅니다. 두 번째는 감시자 $rootScope와 모든 하위 범위 를 평가해야하기 때문에 더 느립니다 .

감시자 중 하나에서 오류가 발생하여를 사용하면 서비스 scope.$digest를 통해 처리되지 않으므로 $exceptionHandler직접 예외를 처리해야합니다. 내부적 scope.$apply으로 try-catch블록을 사용하고 모든 예외를 $exceptionHandler.


문서 자체에 언급 된 것처럼 $ digest주기는 언제든지 수행 $scope.$apply됩니다. 범위 에 대한 개발자 가이드에 따라

식을 평가 한 후 $ apply 메서드는 $ digest를 수행합니다. $ digest 단계에서 스코프는 모든 $ watch 표현식을 검사하고 이전 값과 비교합니다.

그리고 Scope API 문서에 따라

일반적으로 컨트롤러 또는 지시문에서 직접 $ digest ()를 호출하지 않습니다. 대신 $ apply ()를 호출하면 (일반적으로 지시문 내에서) $ digest ()가 강제 실행됩니다.

따라서 명시 적으로를 호출해서는 안되며 메서드 $digest를 호출 $apply하면 다이제스트주기가 트리거됩니다.

참고 URL : https://stackoverflow.com/questions/18697745/apply-vs-digest-in-directive-testing

반응형