使用$ resource数据进行快速API调用

时间:2014-06-19 23:24:40

标签: angularjs

来自Angular文档:

var cards = CreditCard.query(function() {
       // GET: /user/123/card
       // server returns: [ {id:456, number:'1234', name:'Smith'} ];

       var card = cards[0];
       // each item is an instance of CreditCard
       expect(card instanceof CreditCard).toEqual(true);
       card.name = "J. Smith";
       // non GET methods are mapped onto the instances
       card.$save();
       // POST: /user/123/card/456 {id:456, number:'1234', name:'J. Smith'}
       // server returns: {id:456, number:'1234', name: 'J. Smith'};

       // our custom method is mapped as well.
       card.$charge({amount:9.99});
       // POST: /user/123/card/456?amount=9.99&charge=true {id:456, number:'1234', name:'J. Smith'}
     });

上面的代码使用GET请求从服务器获取CreditCard数组,然后使用$ {1}}或$save()等资源类方法自动将API调用返回给服务器。但是,我遇到了两个问题

问题1

$delete()变量需要来自服务器的数组,并且可以将每个cards视为card in cards,并使用上述方法进行API调用。但我们的API响应始终采用以下格式:

$resource

结果是实际数据,或者在本例中是{ success: true, error: null, status: 1, result: [] // THIS IS THE ACTUAL RESULT } 数组。因此,使用我们的API响应运行相同的代码不会在运行cards

之类的内容时发布正确的数据

问题2

我很好奇是否可能(并且可能已经自动支持)使用card.$save()处理绑定到DOM的对象与ng-repeat调用后创建的对象完全相同。

例如,假设我有相同的$resource API调用来获取一组卡片,然后将它们设置为控制器中的CreditCards.query()变量。然后我在我的DOM中有$scope.cards来显示所有卡片。在DOM中的每个ng-repeat="card in cards"上,我还要附加一个card,它将从ng-click="deleteCard(card)"数组中删除相应的卡,并使用该命令向服务器发送DELETE请求特定卡作为请求中的正文

所以$scope.cards函数可能看起来像这样:

deleteCard()

我们可以使用此功能吗?我的猜测是Angular会允许这种情况发生

1 个答案:

答案 0 :(得分:0)

问题#1:

当您使用$resource时,您可以覆盖现有方法和/或添加新方法,以便它可以与您的服务器API一起使用。

你会想做这样的事情:

function transformQueryResponse(data) {
  return JSON.parse(data).result;
}

$resource('/cards/:card_id', {id: '@id'}, {
    query: { method: 'GET', isArray: false, transformResponse: transformQueryResponse }
});

他们举例说明了在documentation for $resource底部创建自定义PUT请求。

问题#2:

是的,你可以这样做。当您从服务器获取$ resource对象时,在ng-repeat中使用它们时,它们将继续充当资源。