0
我試圖在用戶登錄時在屏幕外創建一個登錄表單。動畫取決於if語句,該語句檢查當前認證狀態。然而,爲了使這個聲明起作用,我不得不設置$timeout
,以便在運行if語句之前發送登錄請求並更改身份驗證狀態。設置超時持續時間等於登錄進程運行所花費的時間
只要請求不會超過1000 ms
(並且這也是最低限度,它必須設置爲),這可以正常工作,但有時會花費更長時間。所以我的問題是,如何讓這個持續時間根據請求運行所花費的時間而改變?我不想設置例如3000 ms
並讓用戶等待,如果請求本身只需要1000 ms
就不需要。
登錄過程是使用Firebase完成的,因此它必須向其API發送請求,然後發回響應,這就是持續時間非常不一致的原因。
我從一個通過兩個獨立按鈕激活的指令運行這個動畫;一個顯示的實際形式和一個確認信息,用戶已經進入:
forumApp.directive('mySigninSlide', ['sharedInfo', '$timeout',
function(sharedInfo, $timeout) {
return {
restrict: 'A',
link: function($scope, element, attrs) {
/**
* Display/hide the login form via
* an animation depending on which
* button is clicked and the login state
*/
element.on('click', function() {
var sidebar = $('#signin-wrapper');
if (element.attr('id') === 'confirm-login-btn') {
$timeout(function() {
if (sharedInfo.getAuthState()) {
sidebar.stop().animate({left: '-606px'});
sharedInfo.setError('');
$scope.isAnimated = true;
}
//1000 ms is the bare minimum time
//it takes for the login process
}, 1000);
}
else {
if ($scope.isAnimated === undefined ||
$scope.isAnimated === false) {
sidebar.stop().animate({left: '340px'});
$scope.isAnimated = true;
}
else {
sidebar.stop().animate({left: '-606px'});
$scope.isAnimated = false;
sharedInfo.setError('');
}
}
});
}
};
}]);
您的登錄名應該是ajax調用,而不是您應該在回調函數中檢查auth-state。您現在嘗試做的方式將無法正常工作。 – skobaljic 2015-02-23 10:29:35
@skobaljic然後我怎樣從回調中調用指令?因爲登錄過程目前是AJAX調用。身份驗證狀態存儲在服務中,以便我可以在控制器之間共享。 – Chrillewoodz 2015-02-23 10:32:58
我會說:'send_login_data(url,data,callback:check_auth_state(url,data,callback:function(do_animations()))'所有東西都必須流異步 – skobaljic 2015-02-23 10:43:28