1

Я пытаюсь преобразовать неструктурированное приложение jQuery в MVC AngularJS, но в какой-то момент я потерял или просто не понял ... (К сожалению, я не являюсь JavaScript-богом, поэтому ошибка может также быть там)Навигация по AngularJS по коду состояния HTTP. (MVC design)

Это фрагмент исходного кода 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.

Вот мой контроллер:

// 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» является «недоступен» в мой контроллер. Вызов REST работает, а также привязка данных к представлению в порядке. Я просто не могу реализовать «навигационную часть». Я пропускаю что-то вроде $ watch properties, асинхронного поведения или мой подход просто некорректный ?!

Спасибо за помощь!

ответ

2

Вы можете лучше использовать отображение параметров ресурсов в службе:

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

Таким образом, вы будете иметь возможность повторно использовать один и тот же ресурс для различных действий отдыха (например, пост, удалить.).

и коды контроллера для обработки статусов (обработчики ответа были перемещены на контроллер):

// 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 сервис для возврата обещаний от службы. Но предоставленные решения кажутся мне более чистыми

+0

Привет, Дмитрий, большое вам спасибо! Теперь все работает :) Я никогда не думал о попытке моего решения не в том месте, просто попробовав его не так ... – GMB

+0

Добро пожаловать, -) И только что заметил, что лучшим именем для свойств запросов в отношении изменений будет 'requestByUser 'без указания' get' - теперь он позволяет больше –

Смежные вопросы