我想这意味着有一个循环引用,但对于我的生活,我无法猜测如何解决它。
有人有想法么?
http://plnkr.co/edit/aNcBcU?p=preview
检查 Chrome 中的调试控制台(例如),您会看到错误。违规行是
scope.map = map;
scope.map 正在控制器上通过“$watched”
$scope.$watch("options.map", function (map) { ... }, true);
我想这意味着有一个循环引用,但对于我的生活,我无法猜测如何解决它。
有人有想法么?
http://plnkr.co/edit/aNcBcU?p=preview
检查 Chrome 中的调试控制台(例如),您会看到错误。违规行是
scope.map = map;
scope.map 正在控制器上通过“$watched”
$scope.$watch("options.map", function (map) { ... }, true);
这是因为您正在比较对象是否相等而不是参考。$watch
将您的声明更改为:
$scope.$watch("options.map", function (map) {
if (map === undefined) {
alert("map has no value");
} else {
alert("map is defined");
}
});
我也遇到了这个问题,发现我正在比较的对象有循环引用。(尝试JSON.stringify()
抛出“TypeError:将循环结构转换为 JSON”)。
当我编辑我的对象以使其没有循环结构时,我解决了这个问题,并且不是通过引用而是通过属性值来比较对象,这正是我所需要的。
$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)