如何将AngularJS $资源中的params序列化为rails 3.2兼容的参数
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何将AngularJS $资源中的params序列化为rails 3.2兼容的参数相关的知识,希望对你有一定的参考价值。
我正在尝试获取角度资源以将我的对象正确地序列化为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的请求完全相同?
根据您是否希望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: {}});
}
In request body:
呼叫:
Page.store_widgets({id: 2, page: {}}, {data: $scope.widget});
Ass $resource docs say:
可以使用以下参数调用类对象或实例对象上的操作方法:
- HTTP GET“类”操作:Resource.action([parameters],[success],[error])
- 非GET“类”操作:Resource.action([parameters],postData,[success],[error])
- 非GET实例操作:实例。$ action([参数],[成功],[错误])
唯一的方法是我能够解决序列化我的参数,所以我可以看到php POST通道中的数据是使用JQuery.param()。
我必须在我的$资源中设置标题:
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
。如果你在$.param
上使用item
,它最终会触发附加到资源的所有DELETE,GET,QUERY等方法。
这个问题在2.0版本的角度解决(
看这里:https://github.com/angular/angular.js/issues/3740
以上是关于如何将AngularJS $资源中的params序列化为rails 3.2兼容的参数的主要内容,如果未能解决你的问题,请参考以下文章
如何将标头动态传递给 angularjs 的 $resource