У меня есть угловое приложение со страницей входа, которая должна показывать диалог загрузки во время обработки запроса. Если логин завершается на бэкэнд, у меня нет проблем, и я убираюсь на страницу контента. К сожалению, при неудачном входе в систему диалог загрузки никогда не скрывается.
Вот структура моего кода:
app.controller('loginController', [
'$scope',
'$http',
'$mdDialog',
function($scope, $http, $mdDialog) {
var showLoading = function(message) {
$mdDialog.show({
templateUrl: '../views/loading.html',
controller: function($scope) {
console.log('dialog created');
$scope.message = message;
}
});
};
$scope.credentials = {
username: '',
password: ''
};
$scope.handleLogin = function() {
showLoading('Logging in...');
$http.post('/login', $scope.credentials).then(function success() {
// go to content page
}, function error(response) {
console.log('login failed');
}).then(function() {
console.log('hide');
$mdDialog.hide();
});
};
}
]);
В моем выпуске я вижу:
login failed
hide
dialog created
Мне интересно, может ли я $mdDialog
как работают обещания или может быть что-то внутренне в службе $mdDialog
которая работает с тайм-аутом.
Как вы видите на выходе, диалог создается только после сбоя входа в систему. Попробуйте сделать http-запрос после завершения действия "show":
app.controller('loginController', [
'$scope',
'$http',
'$mdDialog',
function($scope, $http, $mdDialog) {
var showLoading = function(message, onShown) {
$mdDialog.show({
templateUrl: '../views/loading.html',
controller: function($scope) {
console.log('dialog created');
$scope.message = message;
},
onComplete:onShown
});
};
$scope.credentials = {
username: '',
password: ''
};
$scope.handleLogin = function() {
showLoading('Logging in...', function(){
$http.post('/login', $scope.credentials).then(function success() {
// go to content page
}, function error(response) {
console.log('login failed');
}).finally(function() {
console.log('hide');
$mdDialog.hide();
});
});
};
}
]);
В методе then вы можете поместить три функции.
Вы должны поместить свой "$ mdDialog.hide()"; во второй функции, а не в третьей. Третья функция используется только тогда, когда вы запускаете длинный запрос, и хотите указать процент продвижения вашего запроса.
Что-то вроде этого должно работать:
$http.post('/login', $scope.credentials).then(function success() {
// go to content page
}, function error(response) {
console.log('login failed');
$mdDialog.hide();
});
.then()
который вызывается после разрешения обещаний поста. Если вы внимательно посмотрите на мой код, я не передам ничего для параметра прогресса
$http
к бэкэнду.