我为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
来电吗?
答案 0 :(得分:1)
我有一个有效的解决方案。
简而言之,这是传递给
的对象所需要的deferred.resolve(saveResult);
调用保存更改AJAX请求的成功处理程序。
服务器响应应该包括有关如何从客户端生成的id映射到服务器生成的id(如果服务器生成了id)的信息。这可以是响应中返回的一个keyMapping
属性(就像Breeze API控制器那样)或者我的服务所做的是将keyMapping
属性作为特定资源的子属性返回
客户端代码应创建一个对象数组,如下所示:
{entityTypeName:“完全限定的实体类型名称”, tempValue:“客户端生成的id”, realValue:“服务器生成的id” }
saveResult
对象entities
对象的saveResult
属性是从服务器修改的所有实体的平面列表。由于我的服务API的设计,它可以返回一个实体,以及嵌入其中的子实体,我必须遍历并拉出到一个平面列表中。此外,这些实体对象应该是“原始的”,不包括entityAspect属性或Breeze可能解释为“真实”实体的任何内容。另外 - 一些有用的东西是查看Breeze人员的新样本 - MongoDB Breeze sample。他们实现了一个自定义dataServiceAdapter
,它连接了NodeJS / MongoDB后端。这也提供了一些额外的见解。