Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript ng repeat内的angularjs ng模型性能较差_Javascript_Performance_Angularjs - Fatal编程技术网

Javascript ng repeat内的angularjs ng模型性能较差

Javascript ng repeat内的angularjs ng模型性能较差,javascript,performance,angularjs,Javascript,Performance,Angularjs,在以下情况下,angular存在性能问题: <div ng-repeat="a in array"> <input ng-model="something"> </div> 我在我的控制器中编写了代码,在ng上单击可以更改数组,使其具有不同的对象集。问题是,如果阵列中有相当数量的对象,则单击的响应不如我希望的那样快(短延迟) 经过一些调查,我注意到在我的ng单击中更改数组后,$digest花费了相当长的时间。所以我创造了这个来复制它 真正的应用程序场

在以下情况下,angular存在性能问题:

<div ng-repeat="a in array">
  <input ng-model="something">
</div>

我在我的控制器中编写了代码,在
ng上单击
可以更改数组,使其具有不同的对象集。问题是,如果阵列中有相当数量的对象,则单击的响应不如我希望的那样快(短延迟)

经过一些调查,我注意到在我的
ng单击中更改数组后,
$digest
花费了相当长的时间。所以我创造了这个来复制它

真正的应用程序场景是这样的:我有一个表,其中每一行代表一个可编辑的对象,每个对象都有许多不同的字段,我希望能够编辑。这样,每当我单击表中的某一行时,就会出现另一个html,它在我的对象的属性上具有所有那些具有不同的
输入的
ng repeat
s

有人对如何提高效率有想法吗


谢谢

如果您正在动态创建DOM元素,将会有延迟

如果元素已经在页面上,而您只是将它们隐藏到它们的时间,通常会快得多

您可以使用的另一个方面是感觉响应真实响应——您可以先显示一些静态html,然后用实际元素替换它。用户将在创建实际结果时立即获得结果

编辑 让我们比较使用和不使用
ng模型生成的HTML

带模型

<div ng-repeat="a in array" class="ng-scope">
   <input ng-model="a.qqqq" class="ng-pristine ng-valid">
</div>

加上输入上的eventhandler

无模型

<div ng-repeat="a in array" class="ng-scope">
     <input>
</div>

没有事件处理程序

您可以使用Angular的调试版本进行深入研究,以实际了解添加
ng模型时所做的工作


->花费更多时间的原因很明显-Angular做的更多。

如果我正确理解了您的问题,您正在经历ui阻塞,这会让您的体验变得不稳定。你的收藏品有多少件?如果我没有弄错的话,ng repeat是同步的,如下所示:

因此,如果不使用ng repeat的当前实现方式阻塞UI,您将无法呈现成百上千条记录。唯一的解决方案是使用异步解决方案,一次渲染一点集合。不幸的是,我还没有看到一个异步ng重复(可能存在一个,您应该寻找它或自己实现它并将其提供给我们)

幸运的是,您可以使用ng repeat的limito属性作为类似的攻击。如果您有limito:num,其中num=5,则仅呈现前5条记录。如果设置num=7,则它将保留5条已渲染的记录,并且仅渲染第6条记录和第7条记录

因此,要呈现数千条记录,您需要这样的内容,将限制更改为异步:

<div ng-repeat="a in array | limitTo:tick">

var repeatsynchack=function(){
$scope.$digest();
总和+=+新日期()-t;
如果($scope.tick
我在上更新了你的演示

当然,这也有缺点,因为总渲染时间要长得多。毕竟,这样做只是为了让应用程序更具响应性而进行的权衡


如果我误解了你的意思,请纠正我。

在同一页上输入太多元素通常是个坏主意。这就是为什么专业数据网格编辑器一次只选择在单独的弹出窗口或在线编辑单个数据行的原因。即使在线使用,对象也会动态注入

一个输入元素太重,不能在同一页上有太多的输入元素。我在过去也犯过同样的错误,试图实现一个数据网格,其中所有可编辑字段从一开始就是输入元素。最重要的是,您必须保持活动的角度模型绑定,这会增加性能开销

在您的案例中,最简单的方法之一是实现一个指令,该指令在单击之前显示为span元素,并在单击事件时交换为输入元素。另一种选择–同时使用和切换其可见性样式。从角度上看,后者可能更容易,但效率可能不如前者


还要注意您拥有的其他绑定。当涉及到数据网格时,这变得很重要。在Angular 1.3中,您现在可以使用“:”语法进行一次性绑定,这也可能会有所帮助。

谢谢,但是动态创建DOM元素不是这里的问题。如果在我的示例中只删除
ng模型
,您将看到它的工作速度大大加快。请注意:当添加大量内容时,这是一个问题-通常简单的“请稍候…”是唯一的选项,因此问题是屏幕在所需时间内冻结,我知道这可能是内容太多的问题,但我认为我有相当多的内容,我不认为angular需要比添加普通输入元素多花费300%的时间,似乎过多的开销改变了我的答案-这就是angular需要更多时间的原因吗?我理解它需要更多时间的原因-我只是觉得300%的开销太多了。特别是当angular在你用它做的许多其他事情中没有这样的开销时。创建一个真实的演示你实际在做什么。当我们看不到你的代码时,怎么能让你的代码更有效率呢?嗯,你是对的,但是我的例子太复杂了,无法放在这里解释,所以我试图把它缩小到真正的问题,那就是:为什么会这样
var repeatAsyncHack = function() {
    $scope.$digest();
    sum += +new Date() - t;
    if($scope.tick < numOfObjects) {
        $scope.tick+=tickAmount;
        requestAnimationFrame(repeatAsyncHack);
    } else {
        $('#results').prepend(
            $("<div>" + 
              numOfObjects + ' objects test took: ' + sum +
              "ms</div>"));
    }
}