2014-11-20 2 views
1

У меня есть этот код в моем контроллере (я делаю нг-повтор в представлении):Restangular ResponseInterceptor для загрузки состояния выдает ошибку

$scope.projects = Restangular.all('projects').getList().$object; 


И тогда у меня есть этот объект, который получит года вернулся из mongolab API

[ 
    { 
     _id: { "$oid" : "546a3bdee4b0bfd97138fe08"}, 
     "picture" : "http://placehold.it/400x400" , 
     "name" : "Square Campus" , 
     "address" : "293 Grafton Street, Shasta, Arizona, 6757" , 
     "phone" : "+1 (916) 544-2274" , 
     "buildings" : [ 
      { "name" : "North Campus" , "floors" : "4" , "users" : "8"} , 
      { "name" : "South Campus" , "floors" : "2" , "users" : "15"} , 
      { "name" : "East Wing" , "floors" : "8" , "users" : "23"} 
     ] 
    }, 
    { 
     ... // Other project 
    }, 
    { 
     ... // Other project 
    } 
] 


Теперь, это работает отлично сам по себе, я могу получить й e для отображения в представлении. Но я пытаюсь добавить RequestInterceptor и ResponseInterceptor, чтобы добавить загрузчик загрузки при загрузке данных.

Добавление этого:

 RestangularProvider.addRequestInterceptor(function() { 
      console.log('loading data'); 
     }); 

     RestangularProvider.addResponseInterceptor(function() { 
      console.log('loaded data'); 
     }); 


Вызывает следующую ошибку:

Error: Response for getList SHOULD be an array and not an object or something else 


У меня аналогичная проблема на странице подробно, когда я пытаюсь получить доступ к зданий:

var detailProject = Restangular.one('projects', $routeParams.projectId); 
    detailProject.get().then(function (project) { 
      $scope.project = project; 

      project.buildingTotals = _.reduce(project.buildings, 
       function (sums, building) { 
        return { 
         floors: sums.floors + parseInt(building.floors), 
        }; 
       }, 
       { floors: 0 } 
      ); 
     }); 


API Возврат:

{ 
    "_id" : { "$oid" : "546a3bdee4b0bfd97138fe08"} , 
    "picture" : "http://placehold.it/400x400" , 
    "name" : "Square Campus" , 
    "address" : "293 Grafton Street, Shasta, Arizona, 6757" , 
    "phone" : "+1 (916) 544-2274" , 
    "buildings" : [ 
     { "name" : "North Campus" , "floors" : "4" , "users" : "8"} , 
     { "name" : "South Campus" , "floors" : "2" , "users" : "15"} , 
     { "name" : "East Wing" , "floors" : "8" , "users" : "23"} 
    ] 
} 


дает следующее сообщение об ошибке:

TypeError: Cannot read property 'buildings' of undefined 



Пожалуйста обратите внимание, что этого не происходит, если ResponseInterceptor отсутствует в конфиге.

Есть ли что-то, что я делаю неправильно? Я думаю, что я указываю, что каждое возвращение должно быть объектом?

ответ

3

Вам необходимо вернуть значения из ваших перехватчиков.

var pendingRequests = 0; 

RestangularProvider.addRequestInterceptor(
    function (element, operation, what, url) { 
     if (pendingRequests == 0) { 
      console.log('loading data (show indicator)'); 
     } 
     pendingRequests++; 
     return element; 
    }); 

RestangularProvider.addResponseInterceptor(
    function (data, operation, what, url, response, deferred) { 
     pendingRequests--; 
     if (pendingRequests == 0) { 
      console.log('loaded data (hide indicator)'); 
     } 
     return data; 
    }); 

RestangularProvider.addErrorInterceptor(
    function(response, deferred, responseHandler) { 
     pendingRequests--; 
     if (pendingRequests == 0) { 
      console.log('loaded data (hide indicator)'); 
     } 
     return true; // error not handled 
    }); 

Смотрите документацию для получения дополнительной информации:

+0

Спасибо так много ... забыл прочитать: «Это функция, которая должна возвращать элемент для запроса " – eHx