Angularjs 전역 변수가 역할 영역에 의해 감청되는 올바른 자세

1559 단어
만약 당신이 결론만 알고 싶다면:

$scope.$watch($rootScope.xxx,function(newVal,oldVal){
//do something
})

왜 아니냐고 물어보시더라고요.

$rootScope.$watch("xxx",function(newVal,oldVal){
//do something
})

최근의 버그로 말하자면 왜 첫 번째 방식을 사용해야 합니까?
논리는 그림과 같다. 처음에 나는 $rootScope.$를 사용했다.watch의 작법.angularjs가 $rootScope에 있는 watch가 전역적으로 등록되면 유효하기 때문입니다.나의 이 전역 변수는 마침 주문 정보이다. 즉, 서로 다른 컨트롤러가 그에게 변동이 있다. 매번 변동할 때마다 $rootScope.$를 촉발한다.watch는 다른 컨트롤러에 들어갑니다.$rootScope의 $broadcast를 비교해 보면 전역적으로 출발합니다.
사실 이것은 유일한 방법이 아니다. angular 원본을 찾아보면 watch 방법의 원본을 찾을 수 있다.

return function deregisterWatch() {
if (arrayRemove(array, watcher) >= 0) {
incrementWatchersCount(scope, -1);
}
lastDirtyWatch = null;
};

이 코드는 수동으로watch를 청소하는 것이 가능하다는 것을 알려준다.예:

var watcher = $rootScope.$watch("xxx",function(){});
//  watcher 
watcher();

그래도 간단하죠? 위의 방법도 scope의watch에 사용할 수 있습니다.
여기까지 연구할 때 문제가 있다고 생각했는데 $scope에서 정리될까요?그래서 휴, 계속 원본 코드를 넘기면 $destroy 방법에서 다음과 같은 코드를 찾을 수 있습니다.

// Disable listeners, watchers and apply/digest methods
this.$destroy = this.$digest = this.$apply = this.$evalAsync = this.$applyAsync = noop;
this.$on = this.$watch = this.$watchGroup = function() { 
return noop; 
};
this.$$listeners = {};

상기 코드는 본고에서 여러분께 소개한 Angularjs 전역 변수가 작용역에 의해 감청되는 정확한 자세입니다. 여러분의 도움이 있기를 바랍니다. 본고가 잘 쓰지 못했으니 협객 여러분의 많은 지도를 바랍니다.

좋은 웹페이지 즐겨찾기