Breeze dataservice abstractrest - 具有稀疏保存响应

时间:2014-07-11 16:22:08

标签: rest merge breeze

我正在使用breeze labs AbstractRestDataServiceAdapter。在我们的数据服务适配器实现的_createSaveRequest方法中,state.isModified分支模拟oData适配器,并仅在保存请求中发送修改后的字段。

我的问题是我们的REST服务器返回稀疏响应,即输入数据和已更新的实体上的任何字段。结果是从客户端的角度来看,正在消除未在保存的实体中返回的字段。

我在之前的调试会话中看到了合并逻辑,所以我最初认为我可以通过MergeStrategy来影响保存响应处理,但看起来MergeStrategy并不适用于保存方案。看起来AbstractRestDataServiceAdapter假设服务器正在保存响应中返回完整实体。

我们有哪些选项来管理来自服务器的稀疏响应,该响应保留了保存响应中未返回的字段状态?

是否存在我们应该覆盖的特定AbstractRestDataServiceAdapter方法来管理合并保存响应?

2 个答案:

答案 0 :(得分:2)

查看 breeze.labs.dataservice.abstractrest.js 适配器的changeRequestSucceeded方法,该方法处理每个特定于实体的响应,特别是顶部的行:

var saved = saveContext.adapter._getResponseData(response);
if (saved && typeof saved === 'object') {
    // Have "saved entity" data; add its type (for JsonResultsAdapter) & KeyMapping
    saved.$entityType = saveContext.originalEntities[index].entityType;
    addKeyMapping();
} else {
    ...
}
saveContext.saveResult.entities.push(saved);
return saved;

请注意对saveContext.originalEntities[index]

的引用

假设您知道saved对象中的数据仅代表您需要合并到缓存中的实体的特定属性

在这个适配器的具体实现中,您在这个方法的版本中处于优势地位,以便将saved的属性值与saveContext.originalEntities[index]的属性值组合起来将合并后的结果推送到saveContext.saveResult.entities

答案 1 :(得分:0)

无需在保存时实际从服务器返回实体。 breeze.dataService.odata和breeze.dataservice.mongo适配器都存在此问题,其中服务器仅返回部分或部分已保存的entites。唯一的要求是dataService适配器saveChanges方法返回一个具有两个属性的对象,例如

return { entities: entities, keyMappings: keyMappings };

如果您实际上只有从服务器返回的已修改字段,则必须自己管理合并,但这并不是那么复杂。对于每个已保存的实体'只需在缓存中找到它,设置更改的属性并调用acceptChanges并返回'位于'上面显示的结果中的实体。