我已经建立了一些登录,我希望用户在成功登录后被踢到仪表板页面。截至目前,除了模型在重新加载仪表板页面之前不更新外,一切都按预期工作。
我写了一个处理$ http请求的服务:
abcApp.service('Login', function($q, $http){
return({
login:login
})
var headers = { 'Content-Type': 'application/x-www-form-urlencoded' };
function login(login){
var formVals = {
username: login.username.$modelValue,
password: login.password.$modelValue,
remember: login.remember.$modelValue,
}
var request = $http.post('assets/php/do_login.php', formVals, null, headers);
return( request.then( handleSuccess, handleError ) );
}
function handleSuccess( response ) {
return( response.data );
}
function handleError( response ) {
if (
! angular.isObject( response.data ) ||
! response.data.message
) {
return( $q.reject( "An unknown error occurred." ) );
}
// Otherwise, use expected error message.
return( $q.reject( response.data.message ) );
}
});
以下是应该处理登录的控制器:
$scope.doLogin = function (){
Login.login($scope.login_form)
.then(function(data){
if(data.status == 'success'){
$scope.currentUser = data.user;
$scope.msg = 'Welcome '+data.user.realname;
$scope.userId = data.user.id;
$scope.loggedIn = true;
}
}).then(function () {
return $timeout(function () {
$state.go(
'dashboard',
{},
{reload: true}
);
}, 250);
});
};
最初我把这一切都放在一个控制器里,然后把它分成一个服务和控制器。我已经尝试了$ scope。$ apply,但是我得到了一个inprog错误。如何在不重新加载的情况下更新模型?
答案 0 :(得分:0)
您的控制器及其中的变量将从缓存中提供。
有几种方法可以解决这个问题。首先是在状态定义中禁用缓存...
$stateProvider.
state('dashboard', {
url: '/dashboard',
cache: false,
...但我遇到过无法解决的问题。您还可以在状态更改上设置触发器(登录控制器上的$ stateChangeStart或仪表板控制器上的$ stateChangeSuccess):
$scope.$on('$stateChangeSuccess', function(event, toState, toParams, fromState, fromParams) {
// reload stuff
});
如果您希望它们通过所有控制器触发状态更改,您也可以在$ rootScope上设置这些触发器。