더러워진 $scope
개체 검사
Angular array
는 $scope
객체 에서 간단한 감시자를 유지 합니다. 당신이 어떤 검사하면 $scope
당신은 그것이 포함 것을 발견 할 것이다 array
라고 $$watchers
.
각 감시자는 object
다른 것들을 포함 하는
- 감시자가 모니터링하고있는 표현입니다. 이것은 단지
attribute
이름이거나 더 복잡한 것일 수 있습니다 .
- 식의 마지막으로 알려진 값입니다. 이는 현재 계산 된 표현식 값과 비교하여 확인할 수 있습니다. 값이 다르면 감시자가 기능을 트리거하고
$scope
더티로 표시합니다 .
- 감시자가 더러워지면 실행될 기능입니다.
감시자 정의 방법
AngularJS에서 감시자를 정의하는 방법에는 여러 가지가 있습니다.
당신은 명시 적으로 할 수 에 .$watch
attribute
$scope
$scope.$watch('person.username', validateUnique);
{{}}
템플릿에 보간을 배치 할 수 있습니다 (현재에 감시자가 생성됩니다 $scope
).
<p>username: {{person.username}}</p>
ng-model
감시자를 정의하는 것과 같은 지시문을 요청할 수 있습니다 .
<input ng-model="person.username" />
그만큼 $digest
사이클은 마지막 값에 대한 모든 관찰자를 확인
일반 채널 (ng-model, ng-repeat 등)을 통해 AngularJS와 상호 작용할 때 지시문에 의해 다이제스트주기가 트리거됩니다.
다이제스트주기는 모든 하위 요소 의 깊이 우선 순회입니다$scope
. 각각 $scope
object
에 대해 반복하고 $$watchers
array
모든 표현식을 평가합니다. 새 표현식 값이 마지막으로 알려진 값과 다른 경우 감시자의 함수가 호출됩니다. 이 함수는 DOM의 일부를 다시 컴파일하고에 대한 값을 다시 계산하고 $scope
를 트리거 AJAX
request
할 수 있습니다.
모든 범위가 순회되고 모든 시계 표현이 마지막 값에 대해 평가 및 확인됩니다.
감시자가 트리거되면 $scope
더티
감시자가 트리거되면 앱이 변경된 것을 알고 앱이 $scope
더티로 표시됩니다.
감시자 기능은 $scope
부모 또는 다른 특성을 변경할 수 있습니다 $scope
. 하나의 $watcher
함수가 트리거 된 경우 다른 함수가 $scope
여전히 깨끗한 지 보장 할 수 없으므로 전체 다이제스트주기를 다시 실행합니다.
AngularJS에는 양방향 바인딩이 있으므로 데이터를 $scope
트리로 다시 전달할 수 있기 때문 입니다. $scope
이미 소화 된 값을 더 높게 변경할 수 있습니다 . 아마도의 값을 변경했을 수 있습니다 $rootScope
.
(가) 경우 $digest
더러운, 우리는 전체 실행 $digest
다시 사이클을
우리 $digest
는 다이제스트 사이클이 깨끗해질 때까지 (모든 $watch
표현식이 이전 사이클에서와 동일한 값을 갖거나) 다이제스트 한계에 도달 할 때까지 사이클을 계속 반복 합니다. 기본적으로이 제한은 10으로 설정되어 있습니다.
다이제스트 한계에 도달하면 AngularJS가 콘솔에서 오류를 발생시킵니다.
10 $digest() iterations reached. Aborting!
다이제스트는 기계에서는 어렵지만 개발자에게는 쉽습니다.
보시다시피 AngularJS 앱에서 무언가가 변경 될 때마다 AngularJS는 $scope
계층 구조의 모든 단일 감시자 를 확인하여 응답 방법을 확인합니다. 개발자에게는 배선 코드를 거의 작성하지 않아도되기 때문에 생산성이 크게 향상됩니다. AngularJS는 값이 변경되었는지 확인하고 나머지 앱을 변경과 일치하게 만듭니다.
기계의 관점에서 볼 때 이것은 비효율적이며 너무 많은 감시자를 만들면 앱 속도가 느려집니다. Misko는 앱이 구형 브라우저에서 느리게 느껴지기 전에 약 4000 명의 감시자를 인용했습니다.
예를 들어이 제한은 ng-repeat
큰 경우에 쉽게 도달 할 수 있습니다 JSON
array
. 감시자를 만들지 않고 템플릿을 컴파일하기 위해 일회용 바인딩과 같은 기능을 사용하여이 문제를 완화 할 수 있습니다.
너무 많은 감시자를 만드는 것을 피하는 방법
사용자가 앱과 상호 작용할 때마다 앱의 모든 단일 시청자가 한 번 이상 평가됩니다. AngularJS 앱 최적화의 큰 부분은 $scope
트리 의 감시자 수를 줄이는 것 입니다. 이 작업을 수행하는 쉬운 방법 중 하나 는 한 번의 바인딩 입니다.
거의 변경되지 않는 데이터가있는 경우 :: 구문을 사용하여 한 번만 바인딩 할 수 있습니다.
<p>{{::person.username}}</p>
또는
<p ng-bind="::person.username"></p>
바인딩은 포함 템플릿이 렌더링되고 데이터가로드 될 때만 트리거됩니다. $scope
.
ng-repeat
항목이 많은 경우에 특히 중요 합니다.
<div ng-repeat="person in people track by username">
{{::person.username}}
</div>