2013-04-12 18 views

Odpowiedz

16

To dlatego, że jesteś w porównaniu do obiektu dla równości zamiast odniesienia. Zmień swoje oświadczenie $watch do tego:

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

Dziękujemy! Tylko dla innych, którzy mogą potrzebować tej odpowiedzi. Sądzę, że powodem tego jest to, że badany obiekt jest obiektem z wieloma głęboko zagnieżdżonymi właściwościami? Dlaczego testowanie równości na tym obiekcie powoduje przekroczenie rozmiaru stosu wiadomości? – thrag

8

miałem też ten problem i okazało się, że obiekty ja porównywał miał referencje okrężne. (Wypróbował JSON.stringify(), który rzucił "TypeError: Konwertowanie struktury kołowej na JSON").

Kiedy edytowałem mój obiekt, aby nie miał on okrągłej struktury, rozwiązałem ten problem i porównałem obiekty nie przez odniesienie, ale przez wartość właściwości, która była tym, czego potrzebowałem.

5

Trzeci parametr funkcji $ watch opowiada, jak porównać obserwowany obiekt. Fałsz odniesienie tylko porównanie. True do rekurencyjnego porównywania równości, jeśli obiekt zawiera odwołania kołowe, a następnie nad maksymalnym rozmiarem stosu. Na przykład:

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) 
Powiązane problemy