自定义DataService适配器saveChanges方法将实体设置为Unchanged

时间:2013-06-25 03:20:39

标签: breeze

我为BreezeJS实现了一个自定义DataService适配器 - 我想将Breeze与RESTful后端服务(不是OData或ASP.NET Web API)一起使用。

到目前为止 - 在学习曲线之后取得了不错的成绩。

我遇到一个问题,当我调用保存更改时 - 之后我的客户端上的实体不会被标记为'未更改'。它们保持相同的entityState。

我认为它与后端服务的AJAX请求的成功处理程序有关(查看WebAPI适配器的源代码):

        success: function(data, textStatus, XHR) {
            if (data.Error) {
                // anticipatable errors on server - concurrency...
                var err = createError(XHR);
                err.message = data.Error;
                deferred.reject(err);
            } else {
                // HACK: need to change the 'case' of properties in the saveResult
                // but KeyMapping properties internally are still ucase. ugh...
                var keyMappings = data.KeyMappings.map(function(km) {
                    var entityTypeName = MetadataStore.normalizeTypeName(km.EntityTypeName);
                    return { entityTypeName: entityTypeName, tempValue: km.TempValue, realValue: km.RealValue };
                });
                var saveResult = { entities: data.Entities, keyMappings: keyMappings, XHR: data.XHR };
                deferred.resolve(saveResult);
            }

        },

看起来响应中包含一系列“实体”。这些'实体'看起来像什么?它回应了客户端发送的更新的entityAspect.entityState值(服务器响应为'Unchanged')?

这应该传递给deferred.resolve来电吗?

1 个答案:

答案 0 :(得分:1)

我有一个有效的解决方案。

简而言之,这是传递给

的对象所需要的
deferred.resolve(saveResult);

调用保存更改AJAX请求的成功处理程序。

  • 服务器响应应该包括有关如何从客户端生成的id映射到服务器生成的id(如果服务器生成了id)的信息。这可以是响应中返回的一个keyMapping属性(就像Breeze API控制器那样)或者我的服务所做的是将keyMapping属性作为特定资源的子属性返回

    • 客户端代码应创建一个对象数组,如下所示:

      {entityTypeName:“完全限定的实体类型名称”, tempValue:“客户端生成的id”, realValue:“服务器生成的id” }

    • 此数组是saveResult对象
    • 的keyMappings属性
    • entities对象的saveResult属性是从服务器修改的所有实体的平面列表。由于我的服务API的设计,它可以返回一个实体,以及嵌入其中的子实体,我必须遍历并拉出到一个平面列表中。此外,这些实体对象应该是“原始的”,不包括entityAspect属性或Breeze可能解释为“真实”实体的任何内容。

另外 - 一些有用的东西是查看Breeze人员的新样本 - MongoDB Breeze sample。他们实现了一个自定义dataServiceAdapter,它连接了NodeJS / MongoDB后端。这也提供了一些额外的见解。

祝你好运!