javascript - 通过 HTTP 状态代码的 AngularJS 导航。 (MVC设计)

标签 javascript rest angularjs navigation http-status-code-404

我正在尝试将非结构化的 jQuery 应用程序转换为 MVC AngularJS,但有一次我有点迷茫或者我只是不明白......(不幸的是我不是 JavaScript-God 所以错误也可能在那里)

这是原始 jQuery 代码的片段。

$.ajax({
type: "GET",  
    url: "rest/users/" + userId + "/requests",  
                accept: "application/json; charset=utf-8",
                statusCode: {
                    200: function(data) {               
                        // do something
                    },
                    404: function() {
                        window.location = 'index.html';
                    },
                    500: function() {
                        alert("Server Error!");
                    }
                }                   
            });

一个简单的 REST 调用,其中使用 HTTP 响应代码进行导航。不幸的是,我无法在 AnglularJS 中运行它。

这是我的 Controller :

// Inside the RequestController
$scope.requests = RequestModel.getRequestsByUser($rootScope.currentUser.userId);  
    if($scope.requests.statusCode == 200) { 
        // do something         
    }
    else if($scope.requests.statusCode == 404) {
        $location.path('/notFound');
    } else if ($scope.requests.statusCode == 500) {
        $location.path('/error');
    }; // PROBLEM: The if/else statement is never true since statusCode is not available

这是我的模型:

// Inside the RequestModel
this.getRequestsByUser = function(userId) {

    var RequestResource = $resource('../rest/users/' + userId + "/requests");
    var requestList = RequestResource.get({}, function(response, getResponseHeaders) {

        // PROBLEM: The property "stausCode" is "unavilable" at the Controller even if it was set here
        requestList.statusCode = 200;
        console.log("SUCCESS: getRequestsByUser() -> StatusCode: requestList.statusCode");
        console.log(requestList);

    }, function(response, getResponseHeaders) {

        requestList.statusCode = response.status;
        console.log("FAILED: getRequestsByUser() -> StatusCode: " + response.status);

    });
    return requestList;
};

这不起作用,因为“statusCode”在我的 Controller 中“不可用”。 REST 调用有效,并且数据绑定(bind)到 View 也很好。我只是无法实现“导航部分”。我是否遗漏了 $watch 属性、异步行为或者我的方法不正确?!

感谢您的帮助!

最佳答案

您可以在您的服务中更好地利用资源参数映射:

// Inside service
this.requestsByUser = $resource('../rest/users/:userId/requests', {userId:'@userId'});

这样您就可以将相同的资源重复用于不同的休息操作(例如发布、删除)。

以及处理状态的 Controller 代码(响应处理程序已移至 Controller ):

// Inside the RequestController
$scope.requests = RequestModel.requestsByUser
    .get(
      {userId: $rootScope.currentUser.userId},

      function(response) { // success handler
          if(response.status == 200) {
              // do something         
          }
      },

      function(response) { // error handler
          if(response.status == 404) {
              $location.path('/notFound');
          } else if (response.status == 500) {
              $location.path('/error');
          }
      }
    );

另一种方法是使用 $q 服务从您的服务中返回 promise 。但提供的解决方案对我来说似乎更干净

关于javascript - 通过 HTTP 状态代码的 AngularJS 导航。 (MVC设计),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15896380/

相关文章:

javascript - 在函数中设置默认变量值

java - postgreSQL 会支持 rest API 吗?

javascript - 在angularjs中获取从 View 到 Controller 的值

javascript - Typescript 的类型 "Property ' 上不存在错误 'IAugmentedJQuery' datepicker'

javascript - 使用 Protractor 设置 Angular 模型

javascript - 用 div 包装文本,不包括所有子项

javascript - 如何移调 midi 文件?

php - 如何在 Cakephp 的 RESTful api 的 url 中提供字符串?

javascript - 为什么物体的符号相反时会粘在边缘?

ajax - tomcat 上下文元素