我想嵌套发送到后端服务器的参数。到目前为止,我当前的资源看起来像
angular
.module('myApp.users')
.factory('User', user);
user.$inject = ['$resource'];
function user($resource) {
return $resource('/users.json');
}
在我的控制器中......
var user = new User({name: 'jason', email: 'jason@gmail.com'});
user.$save()
发送到我的后端服务器的params最终看起来像
{name: 'jason', email: 'jason@gmail.com'}
理想情况下,我希望发送到后端服务器的params看起来像
{user: {name: 'jason', email: 'jason@gmail.com'}}
我知道在控制器中我可以写
var user = new User({user: {name: 'jason', email: 'jason@gmail.com'}});
但是,我不喜欢这种方法。我想知道的是,有没有办法在用户资源中而不是在控制器中创建嵌套参数。 paramsDefault参数可以帮助吗?
答案 0 :(得分:0)
根据官方文档,您应该能够使用 transformRequest 属性包装/映射输入数据:https://docs.angularjs.org/api/ngResource/service/$resource
请尝试以下代码:
function user($resource) {
var actions = {
transformRequest: function(data, headersGetter){
return {
user: data
}
}
}
return $resource('/users.json',{},actions)
}
请参阅此问题和答案,解释类似的解决方案:Angularjs: Transform data before send with ng-resource and transformRequest
答案 1 :(得分:0)
您可以将原型方法添加到用户构造函数
app.factory('User', function ($resource) {
var User = $resource('/users.json');
// add custom method below
User.prototype.getSpecificUser = function() {
return new User({user: {name: 'jason', email: 'jason@gmail.com'}});
};
return User;
});
在您的控制器
中User.getSpecificUser()
答案 2 :(得分:0)
您如何为$resource
编写简单的包装器?我已经设置了an example plnkr:
我们的想法是将所需的命名空间传递给包装器,然后使用transformRequest
函数扩展每个操作:
app.factory('myResource', function($resource) {
return function(namespace, url, paramDefaults, actions, options) {
var transformRequest = function(data) {
var payload = {};
payload[namespace] = data;
console.log(payload);
return data;
}
// ngResource default actions: https://github.com/angular/angular.js/blob/master/src/ngResource/resource.js#L510
actions = actions || {
'get': {method: 'GET'},
'save': {method: 'POST'},
'query': {method: 'GET', isArray: true},
'remove': {method: 'DELETE'},
'delete': {method: 'DELETE'}
};
Object.keys(actions).map(function(action){
actions[action].transformRequest = transformRequest;
});
return $resource(url, paramDefaults, actions, options)
};
});
然后一个实际的工厂看起来像:
angular
.module('myApp.users')
.factory('User', user);
user.$inject = ['myResource'];
function user(myResource) {
return myResource('user', '/users.json');
}