Angular ngResource $ save方法清除$ resource对象

时间:2016-10-28 10:53:30

标签: javascript angularjs rest ngresource

在这里使用Angular 1.5.5:

有没有办法告诉Angular忽略特定请求的响应体(例如$ save)?在我调用$ save之后,它让我发疯,使用服务器返回的对象更新模型,最初应该用于区分请求的不同分辨率。它导致不需要的形式清晰。有趣的是,即使我发送400或500 http状态代码,这种行为仍然存在。

如果您需要更多信息,相关代码如下。

控制器:

  'use strict';
  angular
    .module('app.operators')
    .controller('OperatorNewController', OperatorNewController);

  OperatorNewController.$inject = ['operatorsService', 'notify'];

  function OperatorNewController(operatorsService, notify) {
    var vm = this;
    vm.done = done;

    activate();

    function activate() {
      vm.operator = new operatorsService();
    }

    function done(form) {
      if (form.$invalid) {
        // do stuff
        return false;
      }

      vm.operator.$save(function(response) {
        if (response.success && response._id) {
          $state.go('app.operators.details', {id: response._id}, { reload: true });
        } else if (response.inactive) {
          // do stuff
        } else {
          // do other stuff
        }
      }, function (error) {
        // do other stuff
      });
    }
  }

服务:

  'use strict';
  angular
    .module('app.operators')
    .service('operatorsService', operatorsService);

  operatorsService.$inject = ['$resource'];

  function operatorsService($resource) {
    return $resource('/operators/:id/', {id: '@_id'}, {
      'update': { method: 'PUT' }
    });
  }

服务器请求处理程序也很简单:

  .post('/', function (req, res) {
    if (!req.operator.active) {
      return res.status(500).json({ inactive: true, success: false });
    }
    // do stuff
    return res.json({ success: true });
  });

无论哪种方式,我都不喜欢必须从服务器发送整个对象的想法(特别是当请求失败时),即使我必须这样做,我仍然需要一种方法来发送一些额外的数据将被Angular忽略。

非常感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

资源对象的$save方法清空并用XHR POST结果替换该对象。为避免这种情况,请使用.save

operatorsService方法
  //vm.operator.$save(function(response) {
  vm.newOperator = operatorsService.save(vm.operator, function(response),
    if (response.success && response._id) {
      $state.go('app.operators.details', {id: response._id}, { reload: true });
    } else if (response.inactive) {
      // do stuff
    } else {
      // do other stuff
    }
  }, function (error) {
    // do other stuff
  });

更新

  

导致不需要的形式清晰。有趣的是,即使我发送了400或500个http状态代码,这种行为仍然存在。

此行为未经验证。

我创建了一个PLNKR来尝试验证此行为,并发现如果服务器返回状态400或500,则$save方法不会替换资源对象。但是如果XHR状态代码为200(OK),则清空并替换资源对象。

DEMO on PLNKR

  

在我调用$save之后,角度使用服务器返回的对象更新模型,这让我很生气

有助于理解浏览器如何处理表单中的传统提交。

提交按钮的默认操作使用method=get。浏览器将表单输入作为查询参数附加到URL,并使用该URL执行HTTP GET操作。然后浏览器清除窗口或框架并从服务器加载结果。

method=post的默认操作是序列化输入并将它们放在HTTP POST的正文中。然后浏览器清除窗口或框架并从服务器加载结果。

在AngularJS中,form指令取消浏览器默认操作,并执行由ng-submitng-click指令设置的角度表达式。包括$resource$get在内的所有$save实例方法都为空,并且如果XHR成功,则将服务器上的XHR结果替换为资源对象。这与浏览器传统上处理表单的方式一致。

在RESTful API中,HTTP GET操作返回服务器资源的状态而不更改它。 HTTP POST操作向服务器添加新的资源状态。 API通常返回新的资源状态,以及ID,位置,时间戳等附加信息。某些RESTful API返回重定向(状态302或303),在这种情况下,浏览器使用新位置透明地执行HTTP GET。 (这有助于Solve the Double Submission Problem。)

在设计RESTful API时,了解传统浏览器的行为方式以及AngfulJS ngResource等RESTful客户端的期望非常重要。