Javascript 视图反映更新的$scope值之前的长延迟
在我的Angular 1.4.X应用程序中,控制器中有一些类似的代码Javascript 视图反映更新的$scope值之前的长延迟,javascript,angularjs,Javascript,Angularjs,在我的Angular 1.4.X应用程序中,控制器中有一些类似的代码 function submitForm() { $scope.submissionInProgress = true; myService.veryExpensiveOperation(); $scope.submissionInProgress = false; } 在视图中,我尝试使用$scope.submissionprogress在veryExpensiveOperation()(同步操作)进
function submitForm() {
$scope.submissionInProgress = true;
myService.veryExpensiveOperation();
$scope.submissionInProgress = false;
}
在视图中,我尝试使用$scope.submissionprogress
在veryExpensiveOperation()
(同步操作)进行时显示/隐藏微调器
<div ng-show="submissionInProgress" class="spinner">
Please wait...
</div>
请稍候。。。
但是,实际情况是,直到
veryExpensiveOperation()
几乎完成后,才会显示微调器。换句话说,调用$scope.submissionInProgress=true
和实际显示微调器之间似乎有几秒钟的延迟。然后$http请求是异步的。$scope.submissionprogress
的值在请求完成之前更改
如果发出$http
请求,最好在解析
函数内切换$scope.submissionprogress
e、 g
您还可以使用回调 回拨 以及非常昂贵的操作功能:
veryExpensiveOperation = function(callback) {
...
success: function() {
if(typeof callback == "Function") {
callback();
}
}
...
}
解决方案
我使用$timeout
修复了此问题,如下所示:
function submitForm() {
$scope.submissionInProgress = true;
$timeout(function() {
myService.veryExpensiveOperation();
$scope.submissionInProgress = false;
});
}
这与问题无关,他的问题是第一个赋值
$scope.submissionInProgress=true
实际显示微调器花费了太多时间。这与问题无关,他的问题是,第一个赋值$scope.submissionInProgress=true
花费了太多的时间来实际显示微调器。@RonDadon很明显,问题submissionInProgress=false
被称为非常快…不,不是。如果调用submissionInProgress=false
太快,微调器将永远不会显示,不会延迟显示。除非问题是错的…@RonDadon对不起,我不明白你的说法。我跟你说的一样。submissionprogress=true
和submissionprogress=false
几乎是立即设置的,这个问题可以通过回调解决。您说submissionprogress=true
立即被submissionprogress=false
覆盖。如果是这种情况,在非常昂贵的操作完成之前,微调器将永远不会出现,或出现很短的时间,然后移除。根据问题,问题是似乎在调用$scope.submissionInProgress=true和实际显示微调器之间有几秒钟的延迟
——这不是一回事。再说一次,除非问问题的人没有把它说对。这个页面有很多绑定吗?尝试使用诊断工具,例如.IsveryExpensiveOperation
是异步操作吗?@LeonardoChaia不,是synchronous@D最后,从AngularJS上下文调用submitForm
?我的意思是,它不是从需要包装在$scope.$apply
?@LeonardoChaia中的外部库调用的,它是从AngularJS上下文调用的
veryExpensiveOperation = function(callback) {
...
success: function() {
if(typeof callback == "Function") {
callback();
}
}
...
}
function submitForm() {
$scope.submissionInProgress = true;
$timeout(function() {
myService.veryExpensiveOperation();
$scope.submissionInProgress = false;
});
}