【问题标题】:Angular digest loop角度摘要循环
【发布时间】:2016-10-31 20:45:35
【问题描述】:

我的应用程序有问题,因为它在尝试生成表单时会创建无限循环。我的表单是基于 json 生成的(代码中的示例)。只有当我进入另一个步骤并返回表格时才会出现问题。我不知道是什么导致了这个问题,因为它只在第二次加载状态时发生。是否有可能在以前的状态下创建的角度保持观察者只是相互重叠?

关于这个应用程序的整体想法是,您在“表单”部分有表单定义,然后有一个定义每个模型元素的“模式”,最后有一个存储所有变量的“模型”。

<schema-form
    data-name     = "theemployeeform"
    data-schema   = "$ctrl.json.all_fields.schema"
    data-form     = "$ctrl.json.all_fields.form"
    data-model    = "$ctrl.json.model">
</schema-form>

要查看错误,请打开 chrome 检查器并: 首页 -> 表格 -> 主页 -> 表格 Error: [$rootScope:infdig]

App example on Plunker https://plnkr.co/edit/nkdzwLuEO0RauZT1jpOJ?p=preview

【问题讨论】:

    标签: angularjs infinite-loop digest


    【解决方案1】:

    查看您是否在范围内的属性上创建了自己的手表,并尝试在每次手表执行时修改该属性的值,如下所示

    var app = angular.module('test', [])
    app.controller('ctrl', function($scope) {
      $scope.val = 100;
    
      $scope.$watch('val',function(n,o){
         $scope.val= $scope.val+1;
      })
    
    });
    

    上面的例子创建了一个无限的摘要循环。通常,摘要循环最多执行 10 次,最少执行 2 次,以检查手表中是否有任何属性已更改...基本上它会进行脏检查

    【讨论】:

    • 这是一个问题,我已经与观察者一起经历了常见的错误,但我没有事件创建手表(手动)。示例中相同,没有手动创建 $watch 并且没有更改 i 数据。编辑:确切地说,表单项组件中有观察者,但是这个手表被分配给指定的键并且该键没有改变。问题是为什么该错误仅在再次加载状态时出现,而不是在第一次加载时出现。即使您删除了该观察者错误也会出现。
    【解决方案2】:

    问题出在ng-include 指令中,该指令依赖于控制器中的变量。因为当状态改变 ng-include 找不到模板时,它会尝试加载 index.html 并导致问题。解决方案是在组件内手动编译模板。因为组件没有 compile 作为指令,所以我们需要更改 $postLink() 并将编译放入其中。

    https://plnkr.co/edit/N2kUSCljMxaWTS7bZ2uC?p=preview

    $element.contents().remove();
    $templateRequest(templateUrl).then(function(html){
        var template = angular.element(html);
        var compiledContents = $compile(template);
        compiledContents($scope, function(clone){
             $element.append(clone);
        });
    });
    

    这解决了一个问题。

    【讨论】:

      猜你喜欢
      • 2019-02-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-20
      • 1970-01-01
      相关资源
      最近更新 更多