RangeError: превышен максимальный размер стека вызовов

Я предполагаю, что это означает, что есть круговая ссылка, но для жизни меня не могу угадать, как ее исправить.

У кого-нибудь есть идеи?

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

Проверьте консоль отладки в Chrome (например), и вы увидите ошибку. Линия нарушения

 scope.map = map;

scope.map "отслеживается" на контроллере через

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

Ответы

Ответ 1

Это потому, что вы сравниваете объект для равенства, а не для ссылки. Измените свой оператор $watch на следующее:

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

Ответ 2

У меня также была эта проблема, и выяснилось, что объекты, которые я сравнивал, имеют круговые ссылки. (Пробовал JSON.stringify(), который бросил "TypeError: преобразование круговой структуры в JSON" ).

Когда я редактировал свой объект так, чтобы он не имел круговой структуры, я исправил эту проблему и сравнивал объекты не по ссылке, а по значению свойств, которое было тем, что мне нужно.

Ответ 3

Третий параметр функции $watch указывает, как сравнивать наблюдаемый объект. False только для сравнения. True для сравнения рекурсивного равенства, если объект содержит циклические ссылки, а затем по максимальному размеру стека. Например:

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