2013-01-31 6 views
12

다이제스트주기에서 범위를 제거하는 방법이 있습니까? 즉, 범위 다이제스트주기를 일시 중지/다시 시작 하시겠습니까?다이제스트주기에서 범위 제거 및 복원

필자의 경우 모든 페이지가 이미로드되었지만 모두 표시되지는 않습니다. 그래서 쓸데없는 처리를 피하기 위해 보이지 않는 것들을 중단하고 싶습니다. ng-view + $route을 사용하고 싶지는 않지만 딥 링크가 필요하거나 원하지 않습니다.

나는 this thread을보고 this fiddle에 도착했습니다. 그것은 아마도 작업을 수행하지만 꽤 침입 적이며 프레임 워크가 업데이트 친화적이지는 않습니다.

$scope.suspend()scope.resume()과 같은 다른 해결책이 있습니까? 아니면 덜 침략적 인 (프레임 워크 관점에서)? 현재 $destroy$compile주기를 생각하고 있습니다.

답변

3

프레임 워크가 오늘날 존재하기 때문에 범위에서 다이제스트를 일시 중단/다시 시작하는 방법은 없습니다. 이것을 말하면서 다이제스트주기의 일부로 실행되는 시계의 수를 제한하는 데 사용할 수있는 몇 가지 기술이 있습니다.

우선 화면의 일부가 숨겨져있는 경우 ng-switch 지시문 집합을 사용하여 보이지 않는 부분을 DOM에서 완전히 제거 할 수 있습니다. 다이제스트주기가 $apply 통해 지침에서 트리거 당신이 아이에게 시계를 다시 평가를 제한 할 경우

둘째, 당신은 $digest 대신 $apply를 호출 할 수 있습니다 스코프.

그러면 예, 연결된 토론에서 설명한대로 범위를 파괴하고 다시 작성할 수 있습니다. 그러나 DOM의 일부를 이미 숨기고 있다면 ng-switch과 같은 소리가 더 좋은 옵션 일 수 있습니다.

+0

실제로 'ng-switch'를 사용하는 것은이 유스 케이스의 상당한 옵션입니다. 그러나 비 앵귤러 코드를 사용하는 누군가가'ng-switch'가 조작을 제어하지 않고 DOM의 특정 부분에 대한 업데이트를 중지하고자한다고 합리적이라고 생각하지 않습니까? 분명히'ng-switch' 동작을 모방 할 수는 있지만 큰 하이브리드 프로젝트에서 성능 튜닝의 핵심 기능으로 보인다. 더욱이,'ng-bind' 시계가 작동하지 못하게하는 방법 일 수도 있습니다. 모르겠다 ... 생각을 공유하십시오. –

12

나는 동일한 문제에 부딪 쳤고 AngularJS에 (너무 많은) 간섭하지 않는 흥미로운 솔루션을 발견했습니다. 사용하지 않을 범위이 추가 :

var watchers; 

scope.$on('suspend', function() { 
    watchers = scope.$$watchers; 
    scope.$$watchers = []; 
}); 

scope.$on('resume', function() { 
    scope.$$watchers = watchers; 
    watchers = null; 
}); 

그런 다음이있는 범위와 그 자식 해제 할 수 있습니다 scope.$broadcast('suspend')scope.$broadcast('resume')로 다시 가져.

+0

멋진 트릭. 물론 해킹을 좋아하지는 않지만 버전을 업그레이드하는 것이 더 어려워지기 때문에 확실히 트릭을 수행 할 것입니다. 어쨌든 누군가가이 접근법을 사용한다면, 비활성화 된 동안 새로운 관찰자가 추가 될 수 있으므로 override $ override를 재정의하는 것이 좋습니다. –

+0

방금이 기술에 대한 짧은 글을 올렸습니다. https://coderwall.com/p/d_aisq –

+0

이 기능을 사용하면 항상 비 시각적 인 테이블을 가진 앱을 구할 수 있습니다. 긴 솔루션은 정렬 가능한 테이블을 매김하여 무한한 스크롤을 만드는 것입니다.하지만이 기능은 길 아래로 움직일 수 있으므로 지금 당장보다 중요한 기능에 집중할 수 있습니다. 좋은. 기술 부채를 구하십시오! – FlavorScape