【发布时间】:2014-05-03 02:20:54
【问题描述】:
几天来,我一直在尝试让 Breeze 1.4.9 以与 Breeze Ruby SPA 示例不同的方式与 rails 后端一起工作。我宁愿发送批量保存更改,而不是尝试在每次实体更改时向服务器发送 RESTful 调用。为此,我编写了一个 Rails 控制器/模型方法,它将解析 Breeze SaveChanges POST 中的所有不同实体并采取相应措施。一切都很好,除了对 SaveChanges POST 的响应似乎不满足对 Breeze 的所有检查并且 EntityManager.hasChanges() 即使在成功处理响应后仍然为真。
这是一个典型的循环: Breeze 请求我手工制作的元数据并很好地解析它:
{
"metadataVersion": "1.0.5",
"namingConvention": "rubyNamingConvention",
"localQueryComparisonOptions": "caseInsensitiveSQL",
"dataServices": [
{
"serviceName": "breeze\/Breeze\/",
"hasServerMetadata": true,
"jsonResultsAdapter": "webApi_default",
"useJsonp": false
}
],
"structuralTypes": [
{
"shortName": "VarianceReason",
"namespace": "Icon",
"autoGeneratedKeyType": "Identity",
"defaultResourceName": "VarianceReasons",
"dataProperties": [
{
"name": "id",
"dataType": "Int32",
"isNullable": false,
"defaultValue": 0,
"isPartOfKey": true,
"validators": [
{
"name": "required"
},
{
"name": "int32"
}
]
},
{
"name": "name",
"dataType": "String",
"isNullable": false,
"defaultValue": "",
"maxLength": 256,
"validators": [
{
"name": "required"
},
{
"maxLength": 256,
"name": "maxLength"
}
]
},
{
"name": "createdAt",
"dataType": "DateTime",
"isNullable": false,
"defaultValue": "1900-01-01T08:00:00.000Z",
"validators": [
{
"name": "required"
},
{
"name": "date"
}
]
},
{
"name": "updatedAt",
"dataType": "DateTime",
"isNullable": false,
"defaultValue": "1900-01-01T08:00:00.000Z",
"validators": [
{
"name": "required"
},
{
"name": "date"
}
]
}
]
}
],
"resourceEntityTypeMap": {
"VarianceReasons": "VarianceReason:#Icon"
}
}
我在 Breeze 中进行了实体更改,并在我调用 em.SaveChanges() 时将以下内容发布到 rails:
{
"entities":[
{
"id":-1,
"name":"anyuthingasd",
"created_at":"1900-01-01T08:00:00.000Z",
"updated_at":"1900-01-01T08:00:00.000Z",
"entityAspect":{
"entityTypeName":"VarianceReason:#Icon",
"defaultResourceName":"VarianceReasons",
"entityState":"Added",
"originalValuesMap":{
},
"autoGeneratedKey":{
"propertyName":"id",
"autoGeneratedKeyType":"Identity"
}
}
}
],
"saveOptions":{
}
}
Rails 然后响应:
{
"KeyMappings":[
{
"EntityTypeName":"VarianceReason:#Icon",
"TempValue":-1,
"RealValue":16
}
],
"Entities":[
{
"id":16,
"name":"anyuthingasd",
"created_at":"2014-05-02T14:21:24.221Z",
"updated_at":"2014-05-02T14:21:24.221Z",
"Entity":null
}
]
}
Breeze 然后在新的 id 键映射中合并,但不清除缓存,所以下次我进行另一个实体更改时,它仍然有第一个已经持久化到服务器的更改和新的更改。谁能告诉我我没有从 Rails 方面做出回应,这让 Breeze EntityManager 不满意?我正在尝试追踪 15k 行代码,但不能说我是 JS 忍者。
【问题讨论】:
-
加载一个使用 saveChanges 的示例应用程序并检查响应以查看是否有任何设置可能会更快。
-
不确定我是否完全理解@PWKad。我已经运行了 Breeze ruby SPA 应用程序,但是这个应用程序略有不同,因为我没有节省每次更改。我基本上只是提供一个服务器到客户端名称的映射,但希望其他一切都能正常工作。
-
我提到它可能更容易抓取并运行使用 Web API 实现 saveChanges 的示例之一,以查看返回 JSON 的样子,但看起来 Ward 已经在下面为您复制了返回.
标签: ruby-on-rails ruby angularjs breeze