Я использую angularjs с ui-router.
Я хотел бы использовать объект разрешения для загрузки некоторых асинхронных файлов и отображать только конечную страницу, когда все загружается.
это прекрасно работает, но как я могу показать страницу загрузки?
$stateProvider
.state(model.constants.RouteStates.MAIN, {
url: "/main",
templateUrl: "modules/main.html",
controller: "mainctrl",
controllerAs: "currentCtrl",
resolve: {
app: function($q) {
var deferred = $q.defer();
//do some asyc stuff...
//display a "please-wait"-page for the user while requesting asyc-stuff...
return deferred.promise;
}
}
Вы можете сделать что-то подобное в своем контроллере.
$scope.$on('$stateChangeStart', function(event, toState, toParams, fromState, fromParams) {
if (toState.name="your_resolve_state") {
$scope.showSpinner = true;
}
});
$scope.$on('$stateChangeSuccess', function(event, toState, toParams, fromState, fromParams) {
if (toState.name="your_resolve_state") {
$scope.showSpinner = false;
}
});
или после того, как ваше решение завершилось в вашем контроллере, вы можете позвонить
$scope.showSpinner = false;
в начале
Я использовал другой способ показать загрузочную страницу.
У меня есть глобальная переменная с обещанием, которое будет срабатывать при завершении глобальной иналиации.
var deferred = $q.defer();
mymodule.globalVars.PromiseInit = deferred.promise;
В моем конструкторе (я использую машинопись) я могу просто сказать
export class Test
{
initialized: boolean = false;
constructor()
{
mymodule.globalVars.PromiseInit.then(()=>{
//everything global is loaded so I can start with my controller-stuff
this.initialized=true;
})
}
isInitialized(){
return this.initialized;
}
на моей html-странице я использовал следующее:
<div ng-show="!currentCtrl.isInitialized()">
<div ng-include="'modules/_wait.html'"></div><!--this is my loading-spinner -->
</div>
<div class="container-fluid" ng-show="currentCtrl.isInitialized()">
...
метод isInitialized просто проверяет свойство, которое я устанавливаю, когда все загружается.