1

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

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

我有一个问题,当我调用保存更改时 - 之后我在客户端上的实体没有被标记为“未更改”。他们保持相同的实体状态。

我认为它与对后端服务的 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 值的内容相呼应(服务器响应“未更改”)?

那是应该传递给deferred.resolve调用的吗?

4

1 回答 1

1

我有一个可行的解决方案。

简而言之,这是传递给

deferred.resolve(saveResult);

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

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

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

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

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

另外 - 也有帮助的是查看来自 Breeze 人员的新示例 - MongoDB Breeze 示例。他们已经实现了一个dataServiceAdapter连接他们的 NodeJS/MongoDB 后端的自定义。这也提供了一些额外的见解。

祝你好运!

于 2013-08-21T15:41:47.620 回答