您可以使用控制 ngProgress 的服务(充当它的包装器)并侦听 url 中的更改。
- 每次 url 更改时,
$locationChangeSuccess
都会广播事件(更多信息在$location),我们可以监听调用ngProgress.start()
- 但是我们不知道它什么时候完成(我们不能永远在顶部加载一个栏),因此我们需要
ngProgress.complete()
在我们的控制器中显式调用,或者我们可以假设我们的异步函数可能需要大约 5 秒才能完成并且ngProgress.complete()
在我们的包装服务中使用计时器调用
- 当加载栏已经可见并且 url 发生变化时,我们需要通过调用重置栏的状态
ngProgress.reset()
您可以使用以下方法来解决这些问题:
angular.module('myApp').factory('Progress', function (ngProgress) {
var timer;
return {
start: function () {
var me = this;
// reset the status of the progress bar
me.reset();
// if the `complete` method is not called
// complete the progress of the bar after 5 seconds
timer = setTimeout(function () {
me.complete();
}, 5000);
},
complete: function () {
ngProgress.complete();
if (timer) {
// remove the 5 second timer
clearTimeout(timer);
timer = null;
}
},
reset: function () {
if (timer) {
// remove the 5 second timer
clearTimeout(timer);
// reset the progress bar
ngProgress.reset();
}
// start the progress bar
ngProgress.start();
}
};
});
要监听 url 的变化并显示我们可以使用的进度条:
angular.module('myApp')
.run(function (Progress) {
$rootScope.$on('$locationChangeSuccess', function () {
Progress.start();
});
}
现在我们可以通过注入Progress
服务并在所有异步函数完成时调用该方法来手动控制状态栏的完整性Progress.complete()
(我们也可以通过任何进行异步调用的服务来控制它):
angular.module('myApp')
.controller('SomeCtrl', function (Progress) {
setTimeout(function () {
Progress.complete();
}, 2000);
});