Вложение параметров с помощью ngResource
Я хочу вложить параметры, отправленные на внутренний сервер. Пока мой текущий ресурс выглядит
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()
Параметры, отправленные на мой сервер, выглядят как
{name: 'jason', email: 'jason@gmail.com'}
В идеале я хочу, чтобы параметры, отправляемые на сервер, выглядели так
{user: {name: 'jason', email: 'jason@gmail.com'}}
Я знаю что в контроллере могу написать
var user = new User({user: {name: 'jason', email: 'jason@gmail.com'}});
Однако мне не нравится такой подход. Я хочу знать, есть ли способ создавать вложенные параметры в ресурсе пользователя, а не в контроллере. Может ли здесь помочь аргумент paramsDefault?
3 ответа
Вы можете добавить метод-прототип в функцию конструктора пользователя.
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()
Что вы думаете о написании простой оболочки для $resource
? Я создал пример 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');
}
Согласно официальной документации, вы должны иметь возможность обернуть / отобразить входные данные, используя свойство 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: преобразовывать данные перед отправкой с помощью ng-resource и transformRequest