Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angularjs 服务上的属性未更新_Angularjs_Angular Services - Fatal编程技术网

Angularjs 服务上的属性未更新

Angularjs 服务上的属性未更新,angularjs,angular-services,Angularjs,Angular Services,我在登录系统上遇到了以下问题: 服务menuService上的属性未更新 工作流程: 在成功登录后,我正在更改变量menuService.isUserLoggedIn,但没有像您在console.log上看到的那样正确更新。我做错了什么/错过了什么 代码: app.factory('menuService', function(){ return { isUserLoggedIn: false, } }) app.factory('userService', f

我在登录系统上遇到了以下问题: 服务menuService上的属性未更新

工作流程: 在成功登录后,我正在更改变量menuService.isUserLoggedIn,但没有像您在console.log上看到的那样正确更新。我做错了什么/错过了什么

代码:

app.factory('menuService', function(){
    return {
        isUserLoggedIn: false,
    }
})

app.factory('userService', function($http, menuService){
    var doLogin = function(user){
        $http.post('/login', user)
            .success(function(data, status, header, config){
                menuService.isUserLoggedIn = true
            })
            .error(function(data, status, header, config){
                console.log('Error ' + data)
            })
    }
    return {
        doLogin: doLogin
    }
})
app.controller('LoginController', function($scope, userService, menuService){
    $scope.user = {}

    $scope.doLogin = function(user){
        console.log(menuService.isUserLoggedIn) //FALSE
        userService.doLogin(user)
        console.log(menuService.isUserLoggedIn) //FALSE BUT I think should be TRUE
    }
})
$http.post是异步的,因此您需要返回其承诺,并在完成时使用.then方法检查该值

app.factory('userService', function($http, menuService){
    var doLogin = function(user){
        return $http.post('/login', user)
            .then(function(){
                menuService.isUserLoggedIn = true
            }, function(response){
                console.log('Error ' + response.data)
            });
    };
    return {
        doLogin: doLogin
    }
})
app.controller('LoginController', function($scope, userService, menuService){
    $scope.user = {}

    $scope.doLogin = function(user){
        console.log(menuService.isUserLoggedIn) //FALSE
        menuService.doLogin(user).then(function() {
            console.log(menuService.isUserLoggedIn);
        });
    }
})

但是,成功只有在帖子完成后才会执行,对吗?所以我发布的代码应该可以工作…这就是为什么原始代码不能工作的原因。它调用doLogin,它启动http调用,然后调用console.log,因为http调用仍在进行中。http调用完成后,即执行成功回调,并在console.log之后将值设置为true。