我的应用程序允许用户提供数据进行分析,我想提供一个进度指标。尽管我的模型正确地反映了进度,但DOM只有在分析结束时才会更新(因此也会在摘要循环结束时更新)。有没有一种方法可以强制渲染中间摘要?
我意识到我的另一个选择是提取分析,使其独立于摘要循环运行,然后调用$scope$应用,但这种重构是不可取的。
<div>{{progress}}</div>
<script>
...
for(i=0; i<dataPoints.length; i++){
...long-running analysis inside the digest loop...
$scope.progress = (i+1)/dataPoints.length * 100;
//how do I force a DOM update here?
}
...
</script>
如果将循环置于摘要之外并不重要,只要它是主线程的一部分并保持同步,它就不会更新DOM,直到它完成。
您的选择是:
-
设置要在超时功能中执行的每个元素分析,并从中更新进度。如果你不在乎按照什么顺序完成操作,这是很好的,比如
for(i=0; i<arr.length; i++){ $timeout(function(){ //do something here and increase the progress counter }) }
-
如果你关心顺序,可以使用递归函数,比如
function recursive(arr, index){ if(arr.length==index-1){ //you are done } //do something $timeout(function(){ recursive(arr,index+1) }) }
-
如果您不关心旧浏览器,请使用webworker。这是一个更复杂的解决方案;你可以在w3schools上看到它。