Angular ng-repeat性能问题,不断更新

时间:2016-03-18 00:00:48

标签: javascript jquery html angularjs

ng-repeat我遇到了一个非常奇怪的性能问题。即使使用track by,我的重复似乎也在不断发生。

enter image description here

从上面的gif可以看出,我的li元素在开发工具中不断闪烁(使用Chrome开发工具和Firefox开发工具测试),这意味着DOM元素不断被更新/重复。这大大降低了浏览器的性能,并且通常会导致Firefox崩溃。

最初,只有10个li元素,但如果用户向下滚动,我会加载另外10个,因此无限滚动。大约3-4次加载(30-40 li个元素)后,浏览器无响应。

我注意到gif中的第一个li会在短时间内收到id id="sizzle1458257524957"属性,然后消失。我以前从未见过它,它绝对不是来自我自己的代码。不确定这是否是罪魁祸首。

我尝试将$watch()添加到postData使用的ng-repeat范围变量中,然后记录以查看它何时更新,尽管它只会更新两次,所以我是仍然感到困惑的是为什么li元素总是在更新。

值得注意的是,我使用的是jQuery(2.2.0),但不适用于这些元素上的任何事件处理程序。我的角度版本是1.5.0。

1 个答案:

答案 0 :(得分:0)

感谢所有为解决这个问题提供帮助的人。

经过大量的调试和测试后,我设法解决了这个问题。问题是在我的ng-disabled元素中的textarea上使用li内的范围函数。

这是功能:

$scope.isCommentInputEmpty = function(commentPostId) {
    if($(".newsFeedPostItem[data-id='" + commentPostId + "']").find(".feedItemNewComment .taggableInput").val() === '') {
         return true;
    } else {
        return false;
    }
};

然后我有一个ng-disabled="isCommentInputEmpty(post.id)"

的按钮

所以我猜测Angular几乎经常运行该函数来检查textarea是否应该禁用它。

要解决这个问题,我只需在我的textarea中添加一个模型,例如ng-model="post.textareaModel",并使用ng-disabled="post.textareaModel == ''"在模型为空时禁用该按钮。