我正在开发一个在后端使用RESTful api的Javascript Web应用程序(SPA)。在我的客户端datacontext中,我想将对象添加到我的模型图中,然后立即将整个图发送到服务器。
假设以下示例:
我的模型中有一个Person
对象,它本身有一个说PhoneNumbers
的数组作为属性。现在我从api加载一个Person
进行edditing并将其映射到我的模型。假设我想在PhoneNumbers
添加一些电话号码对象。为此,我添加每个数字,例如我的客户端模型的id为零的{"id": 0, "number": 6536652226}
,并在用户单击“保存”时将整个图形发送到服务器。在服务器中,我将id为零的对象(新对象)添加到具有自动递增的ID的数据库中。
我正在根据教程做我的项目。他们做这样的事情来将对象添加到上下文中:
var items = {},
// returns the model item produced by merging json obj into context
mapJsonToContext = function (json) {
var id = mapper.getJsonId(json);
var existingItem = items[id];
items[id] = mapper.fromDto(json, existingItem); //returns the mapped obj
return items[id];
},
add = function (newObj) {
items[newObj.id()] = newObj;
}
问题是,如果我使用这种方法,我将无法通过id删除客户端中新添加但尚未保存的项目,因为所有ID都为零!
有任何解决此问题的建议,还是我需要一种完全不同的方法?
答案 0 :(得分:2)
首先,我发现了两个小误解:
1)忘记“关联数组”。数字数组是您拥有的唯一数组;其他构造只是“对象”(这不是PHP)。
2)如果它是JSON,它是字符串,而不是对象。
除此之外,当你不使用这样的值时,你当然可以使用任意值来表示“新”(虽然我可能使用null
而不是0
)唯一标识尚未添加的项目。例如,这很好:
[
{"id": 0, "number": "6536652226"},
{"id": 0, "number": "9876543210"},
{"id": 0, "number": "0123456789"}
]
这不是:
// WRONG!!!!
{
0: "6536652226",
0: "9876543210",
0: "0123456789"
}
}
当然,如果他们仍然没有身份证,你就无法通过身份证找到号码。你需要选择:
答案 1 :(得分:0)
在新创建的客户端对象上创建localId
属性,并在协调服务器返回数据时将其用作您的密钥。显然,服务器必须将此localId
返回给您。