AngularJS模型不会在$ state.go上更新

时间:2014-09-29 12:50:18

标签: angularjs angularjs-scope angularjs-service

我已经建立了一些登录,我希望用户在成功登录后被踢到仪表板页面。截至目前,除了模型在重新加载仪表板页面之前不更新外,一切都按预期工作。

我写了一个处理$ 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错误。如何在不重新加载的情况下更新模型?

1 个答案:

答案 0 :(得分:0)

您的控制器及其中的变量将从缓存中提供。

有几种方法可以解决这个问题。首先是在状态定义中禁用缓存...

$stateProvider.
  state('dashboard', {
    url: '/dashboard',
    cache: false,

...但我遇到过无法解决的问题。您还可以在状态更改上设置触发器(登录控制器上的$ stateChangeStart或仪表板控制器上的$ stateChangeSuccess):

$scope.$on('$stateChangeSuccess', function(event, toState, toParams, fromState, fromParams) {
// reload stuff
});

如果您希望它们通过所有控制器触发状态更改,您也可以在$ rootScope上设置这些触发器。