Javascript $http PROMITE不更新作用域(ng hide)

Javascript $http PROMITE不更新作用域(ng hide),javascript,angularjs,Javascript,Angularjs,我在这里试图实现的是向我的api发送一个get请求,该api根据用户是否登录做出正确/错误的响应。理想情况下,如果用户已登录,我希望隐藏登录表单。我正在使用angular的内置http方法,该方法返回一个承诺,据我所知,它已经封装在$apply中,因此我原以为作用域会自动更新 我的控制器: .controller('MyCtrl1', ['$scope', 'isLoggedIn', '$timeout', function($scope, isLoggedIn, $timeout) {

我在这里试图实现的是向我的api发送一个get请求,该api根据用户是否登录做出正确/错误的响应。理想情况下,如果用户已登录,我希望隐藏登录表单。我正在使用angular的内置http方法,该方法返回一个承诺,据我所知,它已经封装在$apply中,因此我原以为作用域会自动更新

我的控制器:

.controller('MyCtrl1', ['$scope', 'isLoggedIn', '$timeout', function($scope, isLoggedIn, $timeout) {

        isLoggedIn.getState().then(function(result) {   
            $scope.displayLogin = result.data.state;
        });

        $scope.getLoginState = function() {
             console.log($scope.displayLogin);
        }
}]);
我的服务:

.factory('isLoggedIn', function($http, $q) {
    return {
        getState: function(scope) { 
            return $http.get('/login-state').then(function(result) {
                return result
            });
        }
    }
})
html:


我知道值本身正在更新,因为我有一个带有ng click的按钮绑定到getLoginState方法,该方法返回具有正确值的displayLogin,似乎ng hide没有反映这一点?好像范围没有意识到更改


我如何才能让它工作,使我的真实值隐藏表单?

根据您的代码,您似乎指定您的工厂返回
$http
服务的承诺

.factory('isLoggedIn', function($http, $q) {
    return {
        getState: function(scope) { 
            return $http.get('/login-state');
        }
    }
});

我会试着做一个扑通来检查这个,但是如果你

isLoggedIn.getState().then(function(result) {   
    $scope.displayLogin = result.data.state;
});
试着写

$scope.displayLogin = isLoggedIn.getState()
并修改工厂以返回$http.get的结果,而不是$http.get本身

更新:以下是使用promise($q服务)的工厂版本:

然后您可以这样使用它:

isLoggedIn.getState(function(returnData) {
    $scope.displayLogin = returnData;
});

我必须使用回调来让它正确更新。当您获得数据时,您的promise对象应该更新。这里有一个指向plunker的链接:

我看不到更多的代码。不知道
表单
是否在
范围
上,或者不在
显示登录
属性上。[Offtopic]isLoggedIn服务中的then回调不会返回任何位置,因此可以删除它以节省cpu时间。尽管OP的代码可以简化为这一点,我认为这对他所描述的问题没有任何影响Antonio是对的,但是我确实修改了我的代码,出于某种原因,我看到了很多示例,其中服务是如何构建的,但不知道为什么-我对angular是新手,所以我只是模仿它(但它没有真正的效果)
.factory('isLoggedIn', function($http, $q) {
    return {
        getState: function(cb) { 
          var deferred = $q.defer();
          $http.get("/login-state").success(function(data){
            deferred.resolve(data);
          });
          deferred.promise.then(function (result) {
            return cb(result);
          });
        }
    }
});
isLoggedIn.getState(function(returnData) {
    $scope.displayLogin = returnData;
});