2013-04-12 2 views
15

이것은 순환 참조가 somehwere라는 것을 의미하지만 내 인생에서 나는 그것을 고치는 방법을 추측 할 수 없습니다.RangeError : 최대 호출 스택 크기를 초과했습니다.

누구든지 아이디어가 있습니까?

http://plnkr.co/edit/aNcBcU?p=preview

확인 크롬에서 디버그 콘솔 (예를 들어)와 오류를 볼 수 있습니다. 기분을 상하게하는 라인은

scope.map = map; 

scope.map 당신이 어떤지보다는 참조 개체에 대해 비교하는 때문입니다

$scope.$watch("options.map", function (map) { ... }, true); 

답변

16

통해 컨트롤러에 "지켜 $를"되고있는 것입니다. 이에 $watch 문을 변경 :

$scope.$watch("options.map", function (map) { 
    if (map === undefined) { 
     alert("map has no value"); 
    } else { 
     alert("map is defined"); 
    } 
}); 
+10

고마워요! 이 답변이 필요한 다른 사용자에게만 허용됩니다. 이게 실패하는 이유는 테스트중인 객체가 많은 중첩 속성이있는 객체라는 것입니다. 이 개체에서 테스트 동등성이 스택 크기 초과 메시지를 발생시키는 이유는 무엇입니까? – thrag

8

나는 또한이 문제를했고 객체 내가 순환 참조를 가지고 비교하는 것을 발견했다. (JSON.stringify()이 'TypeError : 원형 구조체를 JSON으로 변환'했습니다.).

원형 구조가 없도록 개체를 편집 할 때이 문제를 해결하고 참조가 아닌 개체 값을 필요한 값으로 비교했습니다.

5

$ watch 함수의 세 번째 매개 변수는 감시 된 개체를 비교하는 방법을 알려줍니다. 거짓 비교 만 참조하십시오. 은 순환 참조를 포함하는 객체와 최대 스택 크기를 비교하는 재귀 적 동등성을 비교합니다. 예 :

var a = {ref:b}; 
var b = {ref:a}; 
$scope.$watch('b', function(){ 
    //code here will never called, because stack overflow when comparing the object b. 
}, true) 
관련 문제