2014-12-11 2 views
1

$watchCollection은 $로 시작하는 속성의 변경 사항을 무시할 수 있습니까? 비교를 위해 angular.equals에 의존하므로이 동작은 이미 깊은 $watch을 사용하여 발생합니다.

이상적으로는 $watchCollection이 개체를 얕게 보는 것이 좋습니다 (그리고 유일한 방법). 다른 행동에 정당성이 있습니까?

예 각도 $watch 소스 코드 코멘트에서 촬영

$scope.foo = { 
    $bar: 'someValue', 
    baz: 123456 
}; 

$scope.$watch('foo', function() { 
    console.log('watch'); 
}, true); 

$scope.$watchCollection('foo', function(){ 
    console.log('watchCollection'); 
}); 

// logs 'watch' 
// logs 'watchCollection' 
$scope.foo.baz = 654321; 

// logs 'watchCollection' 
$scope.foo.$bar = 'changed' 
+0

나는 $ watchCollection'은'믿는 확실히이다 arrayLike 객체를 감시합니다. '$ watchCollection은 객체를 얕게 보는 데 선호되는 유일한 방법입니다 '? 나는 당신이 얕은 감시에 제 3의 논쟁없이 다만 시계를 사용할 수 있었다는 것을 짐작한다. – PSL

+1

세 번째 인수가없는 @PSL 시계는 객체 참조가 동등하지 않은지 검사합니다. 그래서'var a = {};'와'a.newProp = 1; 'a == a;가 여전히 'true'이기 때문에 트리거하지 않습니다. 그리고 $ watchCollection도 arrayLike 객체에 국한되지 않습니다. ( –

+0

아, 잊어 버렸습니다 ... – PSL

답변

1

: objectEquality == true가 상기 watchExpression의 부등식은 {@link angular.equals} 함수에 따라 결정된다

.

우리는 angular.equals 문서에서 해당을 볼 수

을 속성 비교시, $로 시작하는 이름을 가진 기능의 유형과 특성의 속성은 무시됩니다.

그럼 왜 $watch 개 비교에서 $ 속성이 무시되는지 설명합니다.

$watchCollection 함수는 실제로 객체가 동일한 지 여부를 확인하기 위해 자체 비교를 수행하며 배열인지 여부에 관계없이 값이 동일한 지 확인합니다. 소스 코드에서 직접 촬영 :

if (oldLength !== newLength) { 
    // if lengths do not match we need to trigger change notification 
    changeDetected++; 
    oldValue.length = oldLength = newLength; 
} 
// copy the items to oldValue and look for changes. 
for (var i = 0; i < newLength; i++) { 
    oldItem = oldValue[i]; 
    newItem = newValue[i]; 

    bothNaN = (oldItem !== oldItem) && (newItem !== newItem); 
    if (!bothNaN && (oldItem !== newItem)) { 
     changeDetected++; 
     oldValue[i] = newItem; 
    } 
} 

나는 그들이 그것을 일부러 그런 식으로 구현하는지 여부를 말할 수는 없지만, 밖으로 어떻게 작동하는지 = D

+1

감사합니다. $ watchCollection을 비슷한 동작을하도록 만들려면 한 줄을 찾았지만 소스 코드를 수정하는 데 자신을 가져갈 수는 없습니다! –

+0

하하 그래, 불행히도 당신이 $ watchCollection' 그것은 실제로 그것을 수정하지 않고 그 행동을 얻을 것입니다. 저는 앵귤러 (Angular) 팀이 당신이 풀 요구를 쏘고 싶다면 반응하는 것을 잘 알고 있습니다! –