1

我正在尝试获取角度资源以将我的对象正确序列化为 rails 3.2 控制器操作。数据格式是 JSON,工作和必需的输入(在 Rails 端)应该是:

"data"=>[{"id"=>29, "column"=>0, "position"=>0}], "id"=>"2", "page"=>{}

这适用于我们的旧代码:

$.ajax
  type: "put"
  url: target
  dataType: "json"
  contentType: "application/json"
  data: JSON.stringify({data: widgets})

但是,如果我尝试使用角度资源,我会得到如下所示的内容:

"data"=>"[{\"id\":28,\"column\":2,\"position\":0}]", "id"=>"2", "page"=>{"id"=>"2"}

我首先创建了一个工厂:

app.factory "Page", ["$resource", ($resource) ->
  $resource "/admin/pages/:collectionRoute:id/:memberRoute",
  {
    id: "@id",
    memberRoute: "@memberRoute",
    collectionRoute: "@collectionRoute",
  },
  {
    update: {method: "PUT"}
    store_widgets: { method: "PUT", params: { data: "@data", memberRoute: 'store_widgets' }, isArray: true }
  }
]

...并store_widgets使用以下方法调用该函数:

Page.store_widgets(id: $scope.page_id, data: JSON.stringify(widgets) )

我已经尝试了一些设置数据参数的替代方法,但它似乎不起作用。它要么以纯字符串形式发布,[Object object]要么以纯字符串形式发布。

关于如何让 $resource 发送的请求与使用纯 jQuery Ajax 的请求完全相同的任何建议?

4

3 回答 3

1

取决于您是要data在请求正文中还是在查询参数中传递:

在查询参数中:

// 'store_widgets' action definition
store_widgets: {
  method: "PUT",
  params: {
    id: "@id",
    data: "@data",
    memberRoute: 'store_widgets'
  },
  isArray: true
}

称呼:

function MyCtrl($scope, Page) {

  $scope.widget = [
    {"id":29, "column":0, "position":0}
  ];

  Page.store_widgets({id: 2, data: $scope.widget, page: {}});

}

笨蛋


在请求正文中:

称呼:

Page.store_widgets({id: 2, page: {}}, {data: $scope.widget});


屁股 $resource 文档说:

可以使用以下参数调用类对象或实例对象上的操作方法:

  1. HTTP GET“类”操作:Resource.action([parameters], [success], [error])
  2. 非 GET “类”操作:Resource.action([parameters], postData, [success], [error])
  3. 非 GET 实例操作:instance.$action([parameters], [success], [error])
于 2013-03-18T15:14:51.167 回答
1

我能够解决序列化参数的唯一方法是使用 JQuery.param(),以便我可以在 PHP POST 通道中看到数据。

我必须在我的 $resource 中设置标题:

headers : {'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'}

我对 $resource 方法的调用。这又快又脏,所以请原谅。

vm.save = function(item) { 
  var data = $.param({username:item.username, email:item.email});
  userFactory.save(data);
}

item由于 $resouce 将方法附加到item. 如果你使用$.paramitem,最终会触发所有附加到资源的 DELETE、GET、QUERY 等方法。

于 2016-08-24T17:33:38.500 回答
0

这个问题在 2.0 版本的 angular(

看这里:https ://github.com/angular/angular.js/issues/3740

于 2018-03-06T08:32:57.857 回答