Javascript 无限$digest()循环AngularJS,在html属性上使用筛选器表达式

Javascript 无限$digest()循环AngularJS,在html属性上使用筛选器表达式,javascript,angularjs,angular-components,angularjs-digest,Javascript,Angularjs,Angular Components,Angularjs Digest,当我试图在组件的属性中传递一个过滤器表达式时,例如(也请参见此,以及下面列出的可能解决方案) 代码,请参见Plnkr: 屏幕截图/图像: 解决方法/解决方案: 我有几个变通方法/解决方案: 在我最初遇到问题的回购协议中:我确实遇到了。有关完整源代码,请参见此处:但我觉得它解决了这个问题,而且我不明白为什么它会触发$digest()循环,为什么它不应该只工作 由@Mistalis回答,他给出了类似的解决方案 filter的目标是获取一个数组作为输入并返回另一个数组 基于某些规则和条件的数组,其中

当我试图在组件的属性中传递一个过滤器表达式时,例如(也请参见此,以及下面列出的可能解决方案)

代码,请参见Plnkr:

屏幕截图/图像:

解决方法/解决方案: 我有几个变通方法/解决方案:

  • 在我最初遇到问题的回购协议中:我确实遇到了
    。有关完整源代码,请参见此处:但我觉得它解决了这个问题,而且我不明白为什么它会触发$digest()循环,为什么它不应该只工作

  • 由@Mistalis回答,他给出了类似的解决方案


  • filter的目标是获取一个数组作为输入并返回另一个数组 基于某些规则和条件的数组,其中数组项具有 与输入相同的结构

    在$digest循环中导致无限循环的原因是 在过滤器中,每个摘要周期过滤器返回一个不同的对象 导致额外的循环。-


    我建议您将过滤器移动到
    todoList
    指令:

    <div ng-repeat="todo in $ctrl.todos | filter: {type:1}">
        <span>{{todo.name}}</span>
    </div>
    
    
    {{todo.name}
    
    如果
    类型
    需要是动态的,则将其作为参数/属性传递给指令


    angular.js repo中有一个未解决的问题,您可以跟进,以了解该问题的发展:


    作为一个临时解决方案,您可以通过更改
    Thank@mistalis将绑定更改为使用浅双向绑定。在我最初遇到问题的repo中,我有一个类似的解决方案:
    。有关完整源代码,请参见此处:。但我觉得它解决了这个问题,我不明白为什么它会触发$digest()循环,为什么它不应该只工作?我还将在问题中对此进行编辑,以反映这一点+1'ed虽然,因为这确实是我现在要做的:/…filter的目标是获取一个数组作为输入,并根据一些规则和条件返回另一个数组,其中数组项的结构与输入相同。在$digest循环中导致无限循环的原因是,在过滤器中,每个digest循环过滤器返回一个不同的对象,该对象会导致额外的循环。很好地处理了这个问题。有关这个问题的更多信息,请参阅。如果你对这个答案投了反对票,请详细说明你为什么这样做?由于这涉及/指向angularjs核心团队自身的反应,我觉得这相当有用。这种变通方法的最大优点是,一旦
    接受了这一正确答案,它就不需要任何重构,因为它与angularjs github问题()中提供的解决方案相对应。
    
    Error: [$rootScope:infdig] http://errors.angularjs.org/1.6.3/$rootScope/infdig?p0=10&p1=%5B%5B%7B%22ms…e%2C%22type%22%3A1%2C%22%24%24hashKey%22%3A%22object%3A5%22%7D%5D%7D%5D%5D
        at eval (angular.js:38)
        at m.$digest (angular.js:18048)
        at m.$apply (angular.js:18280)
        at eval (angular.js:1912)
        at Object.invoke (angular.js:5003)
        at c (angular.js:1910)
        at Object.Pc [as bootstrap] (angular.js:1930)
        at execute (VM877 main.ts!transpiled:21)
        at f (system.js:5)
        at Object.execute (system.js:5)
    
    <div ng-repeat="todo in $ctrl.todos | filter: {type:1}">
        <span>{{todo.name}}</span>
    </div>