20

我想这意味着有一个循环引用,但对于我的生活,我无法猜测如何解决它。

有人有想法么?

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

检查 Chrome 中的调试控制台(例如),您会看到错误。违规行是

 scope.map = map;

scope.map 正在控制器上通过“$watched”

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

3 回答 3

18

这是因为您正在比较对象是否相等而不是参考。$watch将您的声明更改为:

$scope.$watch("options.map", function (map) {
    if (map === undefined) {
        alert("map has no value");
    } else {
        alert("map is defined");
    }
});
于 2013-04-12T05:01:18.063 回答
11

我也遇到了这个问题,发现我正在比较的对象有循环引用。(尝试JSON.stringify()抛出“TypeError:将循环结构转换为 JSON”)。

当我编辑我的对象以使其没有循环结构时,我解决了这个问题,并且不是通过引用而是通过属性值来比较对象,这正是我所需要的。

于 2015-05-03T14:34:31.407 回答
6

$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)
于 2015-06-11T02:45:05.833 回答