如何使用 angular 资源发送带有数组的对象?

How to send objects with arrays using angular resource?

我有一个名为 category_ids 的 属性 产品对象,它是一个 ID 数组。

我已将 $update 方法添加到我的资源工厂,以便我可以发送 PUT 请求。

当我 PUT 时,服务器收到如下数据:

id: 1,
description: 'Yada yada',
category_ids: [1,2,3],
product: { id: 1, description: 'Yada yada' } //<-- I need category_ids in here

如何将 category_ids 数组放入那里的 product 节点?


更多详情:

我正在使用 angular 的资源来更新:

'use strict'

angular.module('myApp').factory 'Product', ($resource) ->

  resource = $resource '/api/v1/products/:id', { id: '@id' },
    update:
      method: 'PUT'

  return resource

有趣的是,这个问题只发生在调用我的对象的实例方法时。在工厂本身调用 class 方法有效:

currentProduct.$update() <-- 这没有给我想要的格式!

Product.update(id: currentProduct.id, product: currentProduct) <-- 这样做 :-\

我们需要 $update 方法的代码,但我怀疑它依赖于 this 关键字,这取决于您调用函数的对象 来自.

能否请您试试这个,如果有效请告诉我们:

currentProduct.$update.bind(Product) ();

如果是,这意味着确实 $update 期望 thisProduct(事实并非如此,在您的示例中为 currentProduct)。

您可以向 $resource 对象添加属性,例如

currentProduct.category_ids = [1,2,3];

现在这个属性成为PUT请求的请求参数。

假设您有 $resource 工厂名称“Product”,那么下面的代码对您有用

  var currentProduct = new Product()

    // Bind properties to resource object
    currentProduct.id = 1
    currentProduct.description = 'Yada yada'
    currentProduct.category_ids =  [1,2,3]  

    // Initiate PUT request.
    currentProduct.$update()

我相信Rails 期望放置请求遵循模式

/product/:id

所以当你想更新产品时,你应该调用它

  product.$update({id:product.id});

然后将向 url

发出请求
http://api/v1/products?id=1

请求负载如

{"id":"1","description":"Yada yada","category_ids":[1,2,3]}

请在此处查看演示

http://plnkr.co/edit/Utjoj6LirxvzMGSwoffo?p=preview

创建 angular 服务

// Angular Service
angular.module('myApp').factory('Product', function($resource,ENV) 
  return $resource(ENV.apiEndpoint+'/api/v1/products/:id', {}, {        
    update: { method: 'PUT' , params:{id:'@id'}}        
  });
});

在你的控制器中你必须设置产品对象

angular.module('myApp').controller('ProductController', 
function ($scope,Product) {

  var requestParams = {
         id: 1,   //Service extracts this parameter to form the url         
         product: { 
            id: 1, 
            description: 'Yada yada' 
            category_ids: [1,2,3]
          }    
  }
   Product.update(requestParams,function(success){
               console.log(success)
        },function(error){
            console.log(error)});       
});