3

我有一个包含循环引用的 javascript 对象图。当我在 Angular 中使用这个对象时,firefox 会给我以下错误消息(“...”包含 100 多个重复的前面和后面的同一行):

Error: too much recursion equals@http://localhost:8080/ops/bower_components/angular/angular.js:995:1 
equals@http://localhost:8080/ops/bower_components/angular/angular.js:997:15 
equals@http://localhost:8080/ops/bower_components/angular/angular.js:997:15
...
equals@http://localhost:8080/ops/bower_components/angular/angular.js:997:15 
equals@http://localhost:8080/ops/bower_components/angular/angular.js:984:17 
equals@http://localhost:8080/ops/bower_components/angular/angular.js:997:15 
$RootScopeProvider/this.$get</Scope.prototype.$digest@http://localhost:8080/ops/bower_components/angular/angular.js:12491:1 
$RootScopeProvider/this.$get</Scope.prototype.$apply@http://localhost:8080/ops/bower_components/angular/angular.js:12762:13 
done@http://localhost:8080/ops/bower_components/angular/angular.js:8357:34 
completeRequest@http://localhost:8080/ops/bower_components/angular/angular.js:8571:7 
createHttpBackend/</xhr.onreadystatechange@http://localhost:8080/ops/bower_components/angular/angular.js:8514:1

有没有办法告诉 angular 考虑对象是否相等,如果它们匹配 X 级别的深度?还是角度不适用于循环引用?

背景故事(如果你想知道)

我很难在杰克逊中找到一个不会序列化已经出现在特定遍历路径上的对象的解决方案。这似乎对我来说应该很简单,但我猜该功能不存在。就在那时,我在这个答案中偶然发现了 jsog,它使我能够将我的对象图(带循环依赖项)转移到 javascript。我很高兴 jsog 为我做了这件事,但是后来我遇到了上面的错误。

4

2 回答 2

3

事实证明,angular 不支持 equals 方法中的循环引用。我分叉了它,提交了一个修复程序,并提交了一个拉取请求。然后我发现已经考虑过类似的修复,但由于性能问题或浏览器兼容性而被拒绝。对于我的项目,我不关心浏览器的兼容性,所以我将使用我自己的 angular 补丁版本来支持循环引用。

拉请求讨论在这里: https ://github.com/angular/angular.js/pull/9762#issuecomment-60282505

git fork 在这里: https ://github.com/andersonbd1/angular.js

于 2014-10-24T15:25:31.897 回答
-1

AngularJs 有一个很好的 equals 接口,我建议看看: https ://docs.angularjs.org/api/ng/function/angular.equals

angular.equals(o1, o2);

它进行深度搜索,但是我不确定这是否可以修改这里还有一些描述 angular.equals http://jsperf.com/angular-equals性能的东西

于 2014-10-22T20:59:01.237 回答