AngularJS $resource возвращает пустой объект и не обновляется данными

У меня есть базовый API для получения/отправки прямо сейчас с AngularJS и Express/Node. Я пытаюсь создать SPA с угловым, где я могу добавлять, получать и удалять доски (в основном, как пост-заметки для Интернета). Каждый раз, когда нажимается кнопка, она запускает $scope.addBoard, объект $resource, который отправляет запрос POST.

Он срабатывает нормально, но возвращает пустой объект, который автоматически обновляет HTML только пустыми данными. Если я хочу, чтобы доска была заполнена информацией, я должен вручную обновить всю страницу. Я попытался включить обратный вызов и использовать обещание, но не могу заставить работать ни один из вариантов. Есть ли способ заставить HTML автоматически обновляться с полными данными после того, как запрос POST сделан угловым?

services.js

  krelloApp.factory('Boards', ['$resource', function($resource) {

  return $resource('api/boards/:id', {}, {
    get: {method: 'GET', isArray: true},
    add: {method: 'POST', transformResponse: []}
  });

}]);

контроллер.js

krelloApp.controller('boardController', ['$scope', '$resource', '$location', '$http', 'Boards',
function($scope, $resource, $location, $http, Boards) {

  // Get all boards
  $scope.boards = Boards.get();

  // Add board
  $scope.addBoard = function() {
    // Boards.add().then(function(response) {
    //   $scope.boards.push(response);
    // })
    // Boards.add(function(response) {
    //   $scope.boards.push(response)
    // });
    $scope.boards.push(Boards.add());
  };

}]);

Маршрут API для POST:

  app.post('/api/boards', isLoggedIn, function(req, res) {
    // Add new board to user
    // May need more posts to add lists and stuff
    User.findOne({ _id: req.user._id }, function(err, user) {
      if (err) {
        return res.send(err);
      };
      newBoard = user.generateBoard('Extra Board');
      newList = user.generateList('Extra List');
      newCard = user.generateCard('Extra Card', 'Card Description');
      newList.cards.push(newCard);
      newBoard.lists.push(newList);
      user.boards.push(newBoard);

      user.save(function(err) {
        if (err) {
          throw err;
        };
      });

      console.log('Success POST');
      console.log('Added Board to user: ' + req.user.local.email);
      res.json(req.user.boards)
    });
  });

HTML:

<div class="row">
  <div class="col-xs-12 col-md-3">
    <div class="btn btn-success" ng-click="addBoard()">
      <span class="fa fa-plus-square"></span>
    </div>
  </div>
</div>

<div class="row">
  <div class="col-xs-12 col-md-3" ng-repeat="board in boards">
    <h1 class="jumbotron">{{ board.title }}</h1>
  </div>
</div>

У меня тоже есть картинка ниже. Каждая доска автоматически генерирует «заголовок» «дополнительной доски», который должен отображаться при ее создании. Единственная проблема в том, что заголовок/данные отображаются только после того, как я вручную обновлю всю страницу. Когда я нажимаю зеленую кнопку, чтобы добавить доску, она дает мне только пустую доску.

введите описание изображения здесь Изображение 2: Действительно странно, потому что на самом деле показывает, что ответ содержит данные, но Angular по какой-то причине не заполняет их.

Сеть Firebug

Окончательное редактирование (ответ):

Спасибо за помощь, ребята! Для тех, у кого такая же проблема, вот что я изменил, чтобы исправить это:

В services.js удалите transformResponse, чтобы он выглядел как add:{method: 'POST'}.

В маршруте API POST измените нижнюю строку, где написано res.json(req.user.boards), на res.json(newBoard);


comment
вам, вероятно, следует использовать первую закомментированную форму, но в .then используйте response.data, а не только response.   -  person Claies    schedule 16.01.2016
comment
Не уверен, что я что-то упускаю, но я думаю, что обещание не регистрируется. Выдает ошибку, говоря, что это не функция. Ошибка: Boards.add(...).then не является функцией $scope.addBoard@127.0.0.1:8000/static/scripts/controller.js:9:5 Пробовал: $scope.addBoard = function() { Boards.add().then(function(response) { $scope.boards.push(response.data);console.log(ответ: + ответ) console.log(response.data: + response.data) }) };   -  person Kyle Truong    schedule 16.01.2016
comment
Я только что заметил, что у вас есть transformResponse : [] в вашем сообщении. Это отключит поведение по умолчанию при анализе ответа в объект JSON, который вы пытаетесь использовать. Что произойдет, если вы удалите этот параметр?   -  person Claies    schedule 16.01.2016
comment
когда я его вынимаю, он все равно заполняет доску (пустую), но мне выдает длинную ошибку со ссылкой. Описание ошибки. Эта ошибка возникает, когда служба $resource ожидает ответа, который можно десериализовать как массив, но получает объект, или наоборот. По умолчанию все действия с ресурсами ожидают объекты, за исключением запроса, который ожидает массивы.   -  person Kyle Truong    schedule 16.01.2016
comment
Что произойдет, если вы поместите исходный объект $resource в массив? $scope.boards=[]; $scope.boards.push(Boards.get());   -  person georgeawg    schedule 16.01.2016


Ответы (1)


Обычно я использую второй закомментированный метод с обратным вызовом. Если вы используете это так, что вы получите?

Boards.add({}, function(response) {
  $scope.boards.push(response)
}, function(error){
  console.log(error);
});
person Brian Baker    schedule 16.01.2016
comment
Не выдает никаких ошибок, хотя по-прежнему выдает пустые доски, которые заполняются данными только в том случае, если я обновляю их вручную. - person Kyle Truong; 16.01.2016
comment
Вы также управляете сервером? Если да, то можете ли вы вернуть массив? Еще одна вещь, которую можно попробовать, это добавить isArray: false.. Я не уверен, что это работает с действием POST. - person Brian Baker; 16.01.2016
comment
Аллилуйя, спасибо за помощь. Я изменил нижнюю строку своего POST API на res.json(newBoard), мой метод добавления $resource на: add: {method: 'POST'} и придерживался той же идеи для контроллера: $scope.boards.push (Доски.добавить()); - person Kyle Truong; 16.01.2016