服务器端更改后,breeze客户端实体不会更新

时间:2013-07-26 00:41:19

标签: knockout.js breeze

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

在保存服务器时,将检查是否只更新了实体的某些attrs,并且还更新了“上次更新日期”attr。

实体列表由一个实体管理器从服务器上拉。

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

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进程中保存后,看起来新的“上次更新日期”值不会被复制。我已经解决了这个问题,但我想知道我是否在这个实现中做错了,是否有更好的方法来构建“单一实体保存”功能?

欢迎提出意见和问题!

1 个答案:

答案 0 :(得分:0)

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

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

无论如何,我不认为Breeze总是在保存时从服务器发回实体的副本 以下是EntityManager source的评论:

  

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

要确认服务器是否从服务器发回实体的副本,请运行Fiddler(这是所有Web开发的宝贵工具),以便您可以准确地看到响应中的内容。如果你问的话,Fiddler甚至会为你打印一个JSON响应。 : - )