angularjs - 在指令属性上使用过滤器会导致 $digest 循环中的无限循环

标签 angularjs coffeescript

尝试在具有隔离作用域的指令上使用过滤器:

<div tags="p.tags | refTags"></div>

在 $digest 循环中导致无限循环:

当应用程序的模型变得不稳定并且每个 $digest 周期触发状态更改和后续 $digest 周期时,就会发生此错误。 Angular 会检测到这种情况并防止无限循环导致浏览器变得无响应。

.directive 'tags', ->
    restrict: 'A'
    scope:
        tags: '='
    templateUrl: 'partials/tags.html'


.filter 'refTags', ->
    (tags) ->
        ['a filtered', 'array of values']

partials/tags.html

<ul>
    <li ng-repeat="tag in tags">{{tag.tag}}</li>
</ul>

Controller 中的p.tags

p.tags = ['HTML5', 'CSS', 'JavaScript', 'Angular JS', 'Backbone JS', 'Node JS', 'SASS + Compass', 'Oragami', 'Running', 'Cat Food', '#catfood']

这种行为正常吗?

  1. 过滤器不能用于传递到指令隔离范围的值吗?
  2. 有解决办法吗?我需要过滤数组值
  3. 是否有其他设计不同的解决方案?

最佳答案

我觉得不是指令问题而是过滤问题。 filter 的目标是获取一个数组作为输入,并根据一些规则和条件返回另一个数组,其中数组项与输入具有相同的结构。

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

我建议您从返回相同的数组开始,即 input = output。检查是否一切都按预期工作。之后添加相关条件。

关于angularjs - 在指令属性上使用过滤器会导致 $digest 循环中的无限循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21100108/

相关文章:

javascript - 带有文件管理器的 AngularJS 打破了表单域的范围?

javascript - 如何使用 JSDoc 记录 CoffeeScript 源代码?

javascript - 在 socket.io 事件回调中更改模型时 Angular View 不更新

angularjs - 更改 Cloudfront 下载分发源路径是否会导致缓存失效?

javascript - AngularJS:带有过滤器的嵌套ng-repeat完成后触发事件

javascript - Jquery.ajax() : Unique AJAX query Identifier?

javascript - 在 Rails 中的确认对话框中单击“取消”时触发 'click' 事件

javascript - AngularJS 创建动态模板

javascript - 监视 sinon 中的 CoffeeScript 构造函数

javascript - 在 javascript 环境中执行