0

我有一个简单的基于微风/淘汰赛的 SPA。我必须为实体列表实现“单一保存”选项 - 编辑将在列表中完成,而不是在单独的弹出窗口中。

保存时,服务器将检查是否仅更新了实体的某些属性,并更新“最后更新日期”属性。

实体列表是由一个实体管理器从服务器中提取的。

为了启用单次保存,已从主实体管理器导出已更新并准备保存的实体并导入到临时实体管理器中。执行保存并且(如果可以的话)对象重新导出并导入回主实体管理器。

function saveSingle(entity)
{
    var tempMgr = MainEntityManager.createEmptyCopy();
    var exp = MainEntityManager.exportEntities([entity]);
    tempMgr.importEntities(exp, { 
        mergeStrategy: breeze.MergeStrategy.PreserveChanges });
    tempMgr.saveChanges()
    .then(function (saveResult) {
        var reImp = tempMgr.exportEntities();
        MainEntityManager.importEntities(reImp);

        entity.Last_Updated_Date(saveResult.entities[0].Last_Updated_Date());
        entity.entityAspect.entityState = breeze.EntityState.Unchanged;

        logger.success("changes saved");
    })
    .fail(function () {
        logger.error("Single Save failed: " + error.message);
    });
}

但是,在重新导出/导入回 MainEntityManager 进程中保存后,新的“上次更新日期”值似乎没有被复制。我已经解决了这个问题,但我想知道我在这个实现中是否做错了什么以及是否有更好的方法来构建“单个实体保存”功能?

欢迎评论和提问!

4

1 回答 1

0

我还没有使用多个 EntityManager 构建 Breeze 应用程序,但我已经阅读了有关该主题的文档(看起来你也有,但如果你没有:http ://www.breezejs.com/documentation/multiple -经理)。

顺便说一句,查看您的代码,我认为您没有按照文档中的描述进行操作。也许这是故意的,但我想我会指出这一点。他们建议您做的是让用户对从您的“沙盒”EntityManager 解析的实体进行本地编辑,然后以某种方式(可能通过导入,正如您所做的那样)将更改复制回主 EntityManager。

无论如何,我认为 Breeze 在您保存实体时并不总是从服务器发回实体副本。
这是来自 EntityManager来源的评论:

// 请注意,visitAndMerge 操作已经过优化,因此如果 // 保存操作实际上没有返回实体 - 即在 OData 和 Mongo 更新和删除期间,我们实际上不会执行合并。

要确认服务器是否正在从服务器发回您的实体副本,请运行Fiddler(它是所有 Web 开发的宝贵工具),以便您可以准确查看响应中返回的内容。如果您要求,Fiddler 甚至会为您漂亮地打印 JSON 响应。:-)

于 2014-02-24T13:02:24.933 回答