AngularJS $资源返回空对象,不会随数据更新

时间:2016-01-16 01:40:51

标签: angularjs express single-page-application angular-resource 2-way-object-databinding

我现在有一个基本的get / post api,现在使用AngularJS和Express / Node。我正在尝试用角度制作SPA,我可以添加,获取和删除板(基本上就像网上的便利贴)。每次单击一个按钮时,它都会触发$ scope.addBoard,这是一个发出POST请求的$ resource对象。

它会正常启动,但会返回一个空对象,该对象仅使用空数据自动更新HTML。如果我希望电路板填充信息,我必须手动刷新整个页面。我尝试使用回调并使用承诺,但我无法获得任何选项。有没有办法在POST请求成为角度方式后,我可以使用完整数据自动更新HTML?

services.js

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

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

}]);

controller.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());
  };

}]);

POST的API路线:

  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>

我也在下面拍了一张照片。每个电路板自动生成“额外电路板”的“标题”,应在其生成时显示。唯一的问题是标题/数据仅在我手动刷新整个页面后显示。当我点击绿色按钮addBoard时,它只给我一个空板。

enter image description here 图2:真的很奇怪,因为它实际上表明响应包含数据,但Angular没有填充它由于某种原因。

Firebug Network

最终编辑(答案):

感谢帮助人员。对于任何有同样问题的人,这是我改变它来修复它:

在services.js中,删除transformResponse,使其看起来像add:{method:'POST'}。

在API POST路由中,将res.json(req.user.boards)的底线更改为res.json(newBoard);

1 个答案:

答案 0 :(得分:1)

我通常使用第二个注释掉的方法和回调。如果您这样使用它,您会得到什么?

Boards.add({}, function(response) {
  $scope.boards.push(response)
}, function(error){
  console.log(error);
});