Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/423.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript &引用;已达到10$digest()迭代次数。流产&引用;使用angular.copy和ng重复_Javascript_Angularjs - Fatal编程技术网

Javascript &引用;已达到10$digest()迭代次数。流产&引用;使用angular.copy和ng重复

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

当我在克隆阵列上重复时,为什么会进入digetst循环

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的调用,因为你必须维护两个数据副本,返回第二个副本,并根据需要修改它。但是确保返回相同的对象,而不是新实例