【问题标题】:angular $http.put() works but $http({method: 'PUT'}) does not角度 $http.put() 有效,但 $http({method: 'PUT'}) 无效
【发布时间】:2017-02-08 03:40:51
【问题描述】:

我正在尝试将所有对 Rails 后端进行 api 调用的服务整合为一个。这是它的样子:

angular.module('feeSuitesApp')
  .factory('FeeSuitesSvc', [
    '$http',
    function ($http) {
      var TransformInstance, Result;

      TransformInstance = function(FeeObj, obj){
        return new FeeObj(obj);
      };

      Result = function(feeSuiteObj){
        var servicePlural = feeSuiteObj.service + 's';
        return $http({
          method: feeSuiteObj.method,
          url: feeSuiteObj.url,
          params: feeSuiteObj.params,
          transformResponse: function(data){
            var w = angular.fromJson(data);
            angular.forEach(w[servicePlural], function(obj, idx){
              w[servicePlural][idx] = TransformInstance(feeSuiteObj.feeObj, obj);
            });
            return w;
          }
        })
      }

      return {
        promise: Result,
      };
  }]);

POST 和 GET 工作正常,但 PUT 给了我一个 RangeError: Maximum call stack size exceeded

FeeRule 看起来像这样:

angular.module('feeSuitesApp')
  .factory('FeeRule', function(){
    //constructor
  var FeeRule = function(obj){
    this.id = obj.id || null;
    this.name = obj.name || '';
    this.fee_suite_id = obj.fee_suite_id || null;
    this.fee_parameter_id = obj.fee_parameter_id || null;
    this.multiplier = obj.multiplier || 1;
    this.addend = obj.addend || 0;
  };

  return FeeRule;
});

但是,如果我进行以下调用,一切正常:

var url = '/api/v3/fee_rules/' + feeRule.id;
$http.put(url, { fee_rule: feeRule});

但如果我像这样使用我的服务,我会收到堆栈溢出错误:

var feeSuiteObj = {
  url: '/api/v3/fee_rules/' + feeRule.id,
  service: 'fee_rule',
  method: 'PUT',
  params: {
    fee_rule: feeRule
  },
  feeObj: FeeRule
};

FeeSuitesSvc.promise(feeSuiteObj).then(function(success){
    $state.go('root');
  },function(error){
    console.log(error);
  });

【问题讨论】:

  • servicefeeobj 是什么,data 在哪里?对象与文档不匹配。 params != data
  • 根据您的错误 (RangeError) 我猜您的问题是从这里提出的:“angular.forEach(w[servicePlural]”。查看更多stackoverflow.com/a/22123896/335905
  • 仅供参考,但您可以使用 $resource 库进行整合。在我的工作项目中,我们有如下构造的 api 调用,我们可以调用 GET、POST、PUT。 function deleteTnApi($resource) { return $resource('/:api/orderNumber/:someNumber/orderVersion/:version', null, { 'update': {method: 'PUT'} });

标签: angularjs


【解决方案1】:

https://docs.angularjs.org/api/ng/service/$http#usage,没有service 也没有feeObj 配置属性,还有params 用于附加序列化数据GET 请求(不是 PUT)。所以试试这个:

var feeSuiteObj = {
  url: '/api/v3/fee_rules/' + feeRule.id,
  method: 'PUT',
  data: {
    fee_rule: feeRule
  }
};

如果你需要传递servicefeeObj,你可以在data object里面做:

data: {
  fee_rule: feeRule,
  service: 'fee_rule',
  feeObj: FeeRule
}

【讨论】:

    猜你喜欢
    • 2015-11-27
    • 2020-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-18
    • 1970-01-01
    • 2023-03-14
    相关资源
    最近更新 更多