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)