解决承诺直到状态改变

时间:2015-01-18 20:12:52

标签: angularjs state resolve

我的角度应用中有一个隐藏页面,因此只有特殊ID用户才能访问它。为了实现它,当状态改变为隐藏状态时,我将HTTP get请求发送到服务器(因为只有服务器知道该特殊id)。

如果服务器通过错误消息回复我,那么我会阻止状态更改过程,在其他情况下,用户会转到该特殊页面。

以下是我正在使用的代码:

angular
.run(["$rootScope", "$location", "$state", "mySvc", function ($rootScope, $location, $state, mySvc) {
    var id = mySvc.getId();    
    $rootScope.$on( '$stateChangeStart', function(event, toState  , toParams, fromState, fromParams) {

        if(toState.name === "specialstate") {
            mySvc.check(id)
                .then(function(result) {
                    if(result.error !== 0) {
                        event.preventDefault();
                    }
                }, function(error) {
                    event.preventDefault();
                });                
        }

    });
}]);

服务中的功能:

        function check(id) {
        var deferred = $q.defer();
        $http({
            url: "/api/url",
            method: "GET",
            headers: {'Content-Type': 'application/json'}
            }).
            then(function (result) {
                console.log(result);
                if(result.data.error === 0) {
                    deferred.resolve(result.data);
                }
                else {
                    deferred.reject(result.data);
                }
            }, function (error) {
                deferred.reject(error);
            });
        return deferred.promise;
    };

一切都是对的,除了一件事:状态正在改变而不等待请求结果。我想我应该使用解决方案,但我不知道如何正确使用它。

感谢。

1 个答案:

答案 0 :(得分:0)

在允许状态转换之前,ui-router支持一个解析对象,该对象定义应解析的数据集(例如,来自服务器)。

.state('hidden', {
  url: '/hidden',
  ...
  resolve: {
    data: function(mySvc) {
      var id = mySvc.getId();    
      return mySvc.check(id).then(function(result) {
        if (result.error !== 0) {
          throw new Error("not allowed");
        }
      });
    }
  }
});

定义的data对象在该隐藏状态下可供您的控制器使用,并且仅在它返回2xx状态代码并且error属性等于0时才会使用。

如果数据已解析,则会发生状态更改并实例化控制器。如果拒绝,则不会发生这种情况。

作为个人注释,我发现这是一个处理授权的好设备。