programing

어레이 변경 시 $watch가 트리거되지 않음

newsource 2023. 3. 1. 11:14

어레이 변경 시 $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