$http承诺不更新作用域(ng-hide)

$http promise not updating scope (ng-hide)

本文关键字:ng-hide 作用域 更新 http 承诺      更新时间:2023-09-26

我在这里试图实现的是向我的api发送一个get请求,该请求根据用户是否登录而以true/false进行响应。理想情况下,如果用户登录,我想隐藏登录表单。我使用的是angular的内置http方法,该方法返回一个promise,据我所知,它已经包含在$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:

  <form method="most" action="/login" ng-hide="displayLogin">

我知道值本身正在更新,因为我有一个带有ng-click的按钮绑定到getLoginState方法,该方法返回具有正确值的displayLogin,看起来ng-hide没有反映这一点吗?就好像作用域不知道该改变一样。

我如何才能做到这一点,让我真正的价值隐藏形式?

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

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

我会尝试制作一个plunker来检查这一点,但如果你不是

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

尝试写入

$scope.displayLogin = isLoggedIn.getState()

并修改您的工厂以返回$http.get的结果,而不是$http.gt本身?

更新:这是一个使用promise($q服务)的工厂版本:

.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;
});

我不得不使用回调来让它正确更新。您的promise对象应该在获得数据时更新。以下是指向plunker的链接:http://plnkr.co/edit/c5YguV5PbE29ZLay3oI4?p=preview