代码之家  ›  专栏  ›  技术社区  ›  Joppa

Breeze数据服务抽象-具有稀疏保存响应

  •  0
  • Joppa  · 技术社区  · 10 年前

    我正在与微风实验室AbstractRestDataServiceAdapter合作。在数据服务适配器实现的_createSaveRequest方法中,state.isModified分支模拟oData适配器,仅在保存请求中发送修改的字段。

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

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

    我们有什么选项来管理服务器的稀疏响应,以保留保存响应中未返回的字段的状态?

    我们是否应该重写一个特定的AbstractRestDataServiceAdapter方法来管理合并保存响应?

    2 回复  |  直到 10 年前
        1
  •  2
  •   Ward    10 年前

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

    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 对象表示 只有特定的财产 需要合并到缓存中的实体。

    在这个适配器的具体实现中,在这个方法的YOUR版本中,您处于非常好的位置,可以将 保存的 以及的属性值 saveContext.originalEntities[索引] 在将合并结果推入 saveContext.saveResult.entities .

        2
  •  0
  •   Jay Traband    10 年前

    在保存时不需要实际从服务器返回实体。微风.dataService.odata和微风.dataService.mongo适配器都存在这样的问题,即服务器只返回部分或部分保存的实体。唯一的要求是dataService适配器saveChanges方法返回一个具有两个财产的对象,例如

    return { entities: entities, keyMappings: keyMappings };
    

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