AngularJS:在长时间循环期间强制更新DOM(即进度指示器)
AngularJS: force DOM update during long-running loop (i.e. progress indicator)
我的应用程序允许用户提供数据进行分析,我想提供一个进度指标。尽管我的模型正确地反映了进度,但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上看到它。
相关文章:
- 在单击任何位置时隐藏元素,而不检查每次DOM单击
- 是否有任何snippet或jQuery插件可以列出easylist.txt模式匹配的DOM中的所有元素
- 在不使用JQuery的情况下隐藏DOM中的选定元素
- 如何在DOM元素上按类型构建此函数
- Windows形成web浏览器控件和Javascript更改的DOM
- Datatables:通过DOM数据源中的名称引用列
- 在DOM中查找一个模式并替换它's的内容使用jquery
- DOM事件通过JSON转换为java
- 将DOM节点值与字符串Javascript进行比较
- delete在Object上效率低下,但在DOM Element's的数据属性,与null out相比
- 流星中DOM的繁殖
- DOM元素和angular元素之间的主要区别是什么
- 当带有渲染器的DOM元素不在屏幕顶部时,移动了场景的坐标
- 如何将Knockout.JS与服务器已经在DOM中呈现的数据同步
- PHP-如何重定向到同一页面并更改DOM's
- 如何使用ViewCompiler手动编译DOM的一部分
- 从popup.js|Chrome扩展访问DOM
- 手动创建旋转活动指示器
- React DOM offsetHeight before rendering
- AngularJS:在长时间循环期间强制更新DOM(即进度指示器)