【问题标题】:breeze client entity not updating after server-side changes微风客户端实体在服务器端更改后不更新
【发布时间】:2013-07-26 00:41:19
【问题描述】:

我有一个简单的基于微风/淘汰赛的 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 进程中保存后,新的“上次更新日期”值似乎没有被复制。我已经解决了这个问题,但我想知道我在这个实现中是否做错了什么以及是否有更好的方法来构建“单一实体保存”功能?

欢迎评论和提问!

【问题讨论】:

    标签: knockout.js breeze


    【解决方案1】:

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-07-31
      • 2012-01-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-30
      • 2011-06-14
      相关资源
      最近更新 更多