Javascript AngularJS渲染阻止progressbar更新

Javascript AngularJS渲染阻止progressbar更新,javascript,jquery,angularjs,Javascript,Jquery,Angularjs,我通过ajax加载对象。在发送请求之前,我在屏幕上放置了一个进度条(使用),并使用setInterval进行更新 收到响应后,我将数据对象转储到作用域中,并以ng repeat的方式渲染它们。但是,在执行此操作时,它会锁定浏览器-大约3秒钟(可以接受,它正在加载一个包含数百个节点的整个文档,每个节点包含2-5条指令) 这意味着我漂亮的动画进度条完全停滞 有没有办法告诉angular在渲染我的所有数据时让进度条继续设置动画(或防止它锁定浏览器)?类似于Visual Basic中的“DoEvents

我通过ajax加载对象。在发送请求之前,我在屏幕上放置了一个进度条(使用),并使用
setInterval
进行更新

收到响应后,我将数据对象转储到作用域中,并以
ng repeat
的方式渲染它们。但是,在执行此操作时,它会锁定浏览器-大约3秒钟(可以接受,它正在加载一个包含数百个节点的整个文档,每个节点包含2-5条指令)

这意味着我漂亮的动画进度条完全停滞


有没有办法告诉angular在渲染我的所有数据时让进度条继续设置动画(或防止它锁定浏览器)?类似于Visual Basic中的“DoEvents”之类的东西?

这与angular无关,而是与js是一种单一威胁语言这一事实有关。如果您希望进度条继续工作,您应该以异步方式解析我们的信息。或者一次加载一小段数据,这意味着将ng repeat分配给一个小数组,并使用递归函数或简单的for look加上超时之类的异步增加它

$scope.list=[];
$scope.list=$scope.list.concat(ajaxlist(0,20)); // adds the first 20 elements to the array
for(var i=21;i<ajaxlist.length;i++){
    (function(index){
       $timeout(function(){
           $scope.list.push(ajaxlist[index]);
       })
    })(i)
}
$scope.list=[];
$scope.list=$scope.list.concat(ajaxlist(0,20));//将前20个元素添加到数组中

对于(var i=21;iHmm…我的猜测是,大量数据完全锁定了所有内容-是否可以一次加载一点数据?用户能否一次看到全部数据?数据到达后,浏览器锁定(但javascript继续执行),然后砰的一声-整个文档出现,我的进度条“完成”我将一点一点地添加数据,我假设一次添加一个对象会导致angularjs使用每个
scope.objects.push(newObj)重新渲染所有对象
已理解…但是,似乎
push
ing一个新项目不会更新DOM。例如:这显示了我的内容
$scope.list=ajaxlist
,但这显示了一个空文档
$scope.list.push(ajaxlist[索引])
,即使上次推后
$scope.list.length
=740。您可能需要在推后执行$scope.$apply-现在刚刚执行了这一操作,它实现了我所期望的效果:每次推后
都会使整个数组呈现Angular,使所有内容都以指数方式变慢:(这将3s等待变为83s。但它不应该冻结浏览器或挂起加载栏。此外,您还可以使用ng repeat中的track by表达式将元素与dom关联,因为您的数据中有某种标识符,这可能有助于在每次推送时呈现整个数组。如果at不起作用或速度太慢的方法是编写一个异步生成列表的指令