Вложение параметров с помощью 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

Другие вопросы по тегам