我有一个复杂的页面(嵌套了很多ng-repeats),所以摘要需要一段时间才能完成。我想向用户提供一些反馈,因此他们不认为浏览器已挂起。
下面是一个示例小提琴,当你单击HIT ME时$ watch挂起2秒钟。我想要"工作"要显示的消息,但它没有。
https://jsfiddle.net/jdhenckel/c7edvdt1/
var app = angular.module('myApp', []);
app.controller('myCtrl', function($scope) {
$scope.n = 0;
$scope.test = function() {
$scope.msg = 'Working...';
$scope.n += 1;
};
$scope.$watch(function(scope) {
return $scope.n;
}, function() {
var x = Date.now() + 2000;
while (x > Date.now()) {}
$scope.msg = 'Done.';
});
});
我还尝试使用JQuery在摘要之前直接更改DOM,但这也没有用。似乎我唯一的选择是使用$ timeout将所有长时间运行的东西移动到未来的摘要中,但这似乎是一个黑客攻击!
是否有一种优雅的方式来通知用户摘要正在运行?
编辑:这是一个可能更现实的例子。
https://jsfiddle.net/jdhenckel/9vcLq0k3/
$scope.n = 0;
$scope.msg = 'Ready';
$scope.test = function() {
$scope.msg = 'Working...';
$timeout(function() {
doStuff();
$scope.msg = 'Done';
}, 100);
}
这是有效的,因为我将所有昂贵的更改移至doStuff
。
我希望Angular会提供一种更简单的方法(例如ng-cloak
进行初始化。)如果没有,那么我将继续使用$ timeout。