어레이 변경 시 $watch가 트리거되지 않음
내가 왜 이 일을 하고 싶은지 알아보는 중이야$watch
유발되지 않습니다.관련 컨트롤러의 일부를 다음에 나타냅니다.
$scope.$watch('tasks', function (newValue, oldValue) {
//do some stuff
//only enters here once
//newValue and oldValue are equal at that point
});
$scope.tasks = tasksService.tasks();
$scope.addTask = function (taskCreationString) {
tasksService.addTask(taskCreationString);//modifies tasks array
};
제가 봤을 때tasks
길이가 다음과 같이 바인딩되어 있기 때문에 올바르게 업데이트되고 있습니다.
<span>There are {{tasks.length}} total tasks</span>
제가 무엇을 빠뜨리고 있나요?
해라$watch('tasks.length', ...)
또는$watch('tasks', function(...) { ... }, true)
.
기본적으로 $watch는 객체의 동일성을 체크하지 않고 참조용으로만 체크합니다.그렇게,$watch('tasks', ...)
는 항상 같은 어레이 참조를 반환하지만 변경되지 않습니다.
업데이트: Angular v1.1.4는 이 경우를 처리하기 위해 $watchCollection() 메서드를 추가합니다.
Showless는 객체의 속성을 감시하고 속성이 변경될 때마다 실행됩니다(어레이의 경우 어레이 항목을 감시하고 객체 맵의 경우 속성을 감시합니다).변경이 검출되면
listener
콜백이 실행됩니다.
@Mark의 매우 좋은 답변입니다.그의 대답 외에, 한 가지 중요한 기능이 있습니다.$watch
알아두어야 할 기능.
를 사용하여$watch
함수 선언은 다음과 같습니다.
$watch(watch_expression, listener, objectEquality)
그$watch
리스너 함수는 현재 watch 식에서 값이 나올 때만 호출됩니다(이 경우,'tasks'
)와 감시하기 위한 앞의 콜 표현이 동일하지 않습니다.각도는 나중에 비교할 수 있도록 개체 값을 저장합니다.그 때문에, 복잡한 옵션을 감시하는 것은, 메모리나 퍼포먼스에 악영향을 미칩니다.기본적으로 시계 표현은 단순할수록 가치가 높아집니다.
시도해 볼 것을 권합니다.
$scope.$watch('tasks | json', ...)
그러면 에 대한 모든 변경 사항을 파악할 수 있습니다.tasks
어레이는 시리얼화된 어레이를 문자열로 비교합니다.
1차원 어레이에서는 $watchCollection을 사용할 수 있습니다.
$scope.names = ['igor', 'matias', 'misko', 'james'];
$scope.dataCount = 4;
$scope.$watchCollection('names', function(newNames, oldNames) {
$scope.dataCount = newNames.length;
});
언급URL : https://stackoverflow.com/questions/15363259/watch-not-being-triggered-on-array-change
'programing' 카테고리의 다른 글
WordPress 템플릿을 CodeIgniter와 통합하는 방법 (0) | 2023.03.01 |
---|---|
ng-model: 빈 문자열은 늘이어야 합니다. (0) | 2023.03.01 |
외부 키 및 외부 키가 Oracle DB에서 참조하는 테이블 목록 (0) | 2023.03.01 |
AngularJS: Angular 외부에서 서비스를 업데이트해야 합니다. (0) | 2023.03.01 |
WooCommerce: 코드로 제품 생성 (0) | 2023.03.01 |