【问题标题】:angularjs: $watch on a collection triggers 'out of memory' exceptionangularjs:集合上的 $watch 触发“内存不足”异常
【发布时间】:2013-06-03 13:54:37
【问题描述】:

我希望在集合中所有对象的 IsSelected 属性设置为 false 时禁用按钮。

要深入观察集合以在属性更改时采取行动,我会这样做:

$scope.$watch('messages', function (i) {
       //do something
}, true);

但集合太大(实际上我只有两个元素,但这些都是大对象)并且我在“内存不足”异常中运行。

那么,我应该怎么做呢?

[编辑]

遵循@boxed 建议:

        $scope.$watch(function () {
            return $($scope.messages).map(function () {
                return this.IsSelected;
            });

        }, function (e) {
            //do something
        });

它仍然很慢,我遇到了错误:

  • 错误执行 JavaScript:达到 10 次 $digest() 迭代。中止!

【问题讨论】:

  • 如果你只是想看collectionn中对象的添加和删除,那么你可以看'messages.length'
  • 你能用你需要观看的项目制作一个影子版本的对象吗?

标签: angularjs


【解决方案1】:

$watch 的第一个参数可以是一个函数。在该函数中,您可以返回所有项目的所有 IsSelected 属性的列表。

【讨论】:

  • 我已经尝试过该解决方案,但我收到一个错误,它非常慢。由于某种原因,在页面加载期间无数次触发了观看代码。我已经更新了上面的代码。错误是 Erreur d'execution JavaScript: 10 $digest() 达到了迭代。中止!在最后 5 次迭代中触发的观察者:[[],[],[],[],[]]
  • 好吧,这听起来像是某种进步:P 也许您应该只在更改 IsSelected 时使用事件处理程序,然后循环遍历这些项目。
  • 我就是这么做的,但 Angular 的方式更像是观察事物的变化,不是吗?
【解决方案2】:

您可以增加摘要限制 https://docs.angularjs.org/api/ng/provider/$rootScopeProvider

        $rootScopeProvider.digestTtl(25);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-09
    • 2015-09-28
    • 2010-10-05
    • 1970-01-01
    相关资源
    最近更新 更多