【问题标题】:AngularJS $resource returns empty object and doesn't update with dataAngularJS $resource 返回空对象并且不更新数据
【发布时间】:2016-01-16 01:40:51
【问题描述】:

我现在有一个基本的 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>

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

图 2:真的很奇怪,因为它实际上显示响应包含数据,但 Angular 出于某种原因没有填充它。

最终编辑(答案):

感谢各位的帮助。对于任何有同样问题的人,这是我为了解决它而改变的:

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

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

【问题讨论】:

  • 您可能应该使用第一个注释掉的表单,但在.then 中,使用response.data 而不仅仅是response
  • 不确定我是否遗漏了什么,但我认为承诺没有注册。给我错误说它不是一个函数。错误: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("response:" + response) console.log("response.data:" + response.data) }) };
  • 我刚刚注意到您的帖子中有transformResponse : []。这将禁用将响应解析为 JSON 对象的默认行为,这是您尝试使用的。如果删除此参数会怎样?
  • 当我把它拿出来时,它仍然会填充一个板(空),但它给了我一个带有链接的长错误。错误描述:当 $resource 服务期望一个可以反序列化为数组但接收到对象的响应时会发生此错误,反之亦然。默认情况下,所有资源操作都需要对象,除了需要数组的查询。
  • 如果将初始 $resource 对象推送到数组会发生什么? $scope.boards=[]; $scope.boards.push(Boards.get());

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


【解决方案1】:

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

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

【讨论】:

  • 没有给我任何错误,但它仍然给我空板,只有在我手动刷新时才会填充数据。
  • 你也控制服务器吗?如果是这样,您可以让它返回一个数组吗?要尝试的另一件事是添加 isArray: false.. 我不确定它是否适用于 POST 操作。
  • 哈利路亚,感谢您的帮助。我将 POST API 的底线更改为 res.json(newBoard),将我的 $resource 添加方法更改为:add: {method: 'POST'},并对控制器保持相同的想法:$scope.boards.push (Boards.add());
猜你喜欢
  • 2014-05-12
  • 1970-01-01
  • 2015-11-24
  • 1970-01-01
  • 1970-01-01
  • 2014-10-05
  • 2014-07-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多