使用ngResource嵌套参数

时间:2017-01-20 18:21:50

标签: javascript angularjs 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()

发送到我的后端服务器的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参数可以帮助吗?

3 个答案:

答案 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');
  }