在我的Web应用程序中,我有产品和购物清单。该服务器提供REST端点。Ember数据的增量更改多对多关系
GET /api/shopping-lists/abc
回报
{
shoppingList: {
id: "abc",
products: ["p123", "p234", "p345"]
}
}
在我Ember 1.7.0
的应用程序,我用Ember Data 1.0.0-beta.6
。我的模型是这样的:
App.ShoppingList = DS.Model.extend({
products: DS.hasMany("product", {async: true}),
});
App.Product = DS.Model.extend({
name: DS.attr("string")
});
,因为我无法找到从许多一对多的关系添加和删除记录,我添加和删除产品/右侧的“灰烬办法”规范的信息从购物清单是这样的:
function addToShoppingList(shoppingList, toBeAddedProduct) {
shoppingList.get("products").then(function(products) {
products.pushObject(toBeAddedProduct);
shoppingList.save();
});
}
function removeFromShoppingList(shoppingList, toBeRemovedProduct) {
shoppingList.get("products").then(function(products) {
products.removeObject(toBeRemovedProduct);
shoppingList.save();
});
}
目前上述函数调用shoppingList.save()
,灰烬数据会发送一个请求,PUT
用JSON的有效载荷包括该购物清单上的所有产品编号:
addToShoppingList(abcShoppingList, p456Product);
//results in PUT on /api/shopping-lists/abc with payload:
{
"shoppingList" : {
"products" : ["p123", "p234", "p345", "p456"]
}
}
如购物清单可以变得很长,我宁愿希望有只增量更新只包括购物清单的变化,即:
{
"shoppingList" : {
"products" : ["p456"]
}
}
我可以灰烬数据只PUT
对记录的更改,而不是发送完整记录?
此外,removeFromShoppingList(..)
函数将发送完整记录作为PUT
请求。相反,我宁愿让它发送增量DELETE
请求。
不,你不能。这是唯一一次保存shoppingList模型吗? – Kingpin2k 2014-11-08 17:17:32
@ Kingpin2k,'addToShoppingList(..)'和'removeFromShoppingList(..)'是我的代码中唯一可以修改'ShoppingList'的'products'关系的地方。我一直在考虑在不依赖Ember Data的情况下自己照顾自定义请求和记录更新,但我会猜测Ember Data带来了这种功能... – Abdull 2014-11-08 17:26:24
只需手动处理它,会更容易。我不知道任何其他客户端ORM是否像您正在谈论的那样进行增量更新。 – Kingpin2k 2014-11-08 18:21:57