Javascript &引用;已达到10$digest()迭代次数。流产&引用;使用angular.copy和ng重复
当我在克隆阵列上重复时,为什么会进入digetst循环Javascript &引用;已达到10$digest()迭代次数。流产&引用;使用angular.copy和ng重复,javascript,angularjs,Javascript,Angularjs,当我在克隆阵列上重复时,为什么会进入digetst循环 angular.module('myApp',[]) .controller('Ctrl1',函数(MyService){ var$ctrl=this; $ctrl.getData=MyService.getData; }) .service('MyService',函数(){ 风险值数据=[ { 名字:'亚当', 年龄:12 }, { 姓名:'鲍勃', 年龄:14 }, { 名字:'凯撒', 年龄:15 }]; this.getData
angular.module('myApp',[])
.controller('Ctrl1',函数(MyService){
var$ctrl=this;
$ctrl.getData=MyService.getData;
})
.service('MyService',函数(){
风险值数据=[
{
名字:'亚当',
年龄:12
}, {
姓名:'鲍勃',
年龄:14
}, {
名字:'凯撒',
年龄:15
}];
this.getData=函数(){
//这是有问题的线路。如果我取消对
//angular.copy可以,但在我的真实场景中,我想
//在返回“data”之前修改其副本,而不必
//影响原始版本。这就是我需要克隆的原因
//首先是它。
返回角度。复制(数据);
};
});代码>
名称
年龄
{{data.name}
{{data.age}
您在视图上使用了$ctrl.getData()
(绑定),该视图使用angular.copy
返回了数据
数组副本。因此,当摘要循环开始时,它计算$ctrl.getData()
并返回数据
副本,这是由于观察者
(绑定)值中的引用更改。Angular重新运行摘要循环(直到所有绑定稳定为止)。它再次尝试计算$ctrl.getData()
值get和数据的新副本。因此,每次更改绑定变量的引用时,这个过程都会继续进行。因为在达到第10次操作后,它会抛出一个错误(默认情况下,角度摘要周期TTL=10)
消化周期如何?
它遍历页面,收集所有绑定并将这些表达式放入$$watchers
数组的$scope
中
它开始初始摘要周期,以评估绑定,并在第页上更新相应的模型值
Digest cycle在内部执行脏检查,它在所有$$watchers
数组中循环并根据$scope
评估这些绑定。脏检查意味着它用其旧值检查观察者表达式当前计算值
若在脏检查中发现任何更改,则再次从上到下(从$rootScope到所有child)重新运行摘要循环
直到所有绑定都变得稳定,这个过程才会发生李>
要修复此错误,必须在数据库中维护变量的两个副本
代码
出现该错误是因为angular.copy()返回对象的新副本实例。当angular运行摘要循环时,作用域总是脏的。摘要迭代的限制是10次。这就是为什么你得到的摘要限制达到错误。把你的服务换成这个,你就可以走了
this.getData = function () {
return data;
};
但是为什么它要多次调用getData()
?我在做什么来重新触发摘要循环?那是因为angular运行摘要两次。一旦作用域没有脏,它将第二次运行摘要循环以检查它是否干净&因此不,这里我们有两个绑定{{data.name}
&{{data.age}
,但是ng repeat
也将放在watcher中,以在每次任何值发生变化时评估其值,PankajParkar的消化周期当然我会的。我知道我得到了阵列的一个新实例(克隆/拷贝)。我不明白的是为什么Angular认为它需要重新运行摘要循环。正如我试图在代码中的注释中解释的那样,我不能仅仅删除对Angular.copy的调用,因为你必须维护两个数据副本,返回第二个副本,并根据需要修改它。但是确保返回相同的对象,而不是新实例