3

我正在开发一个后端带有 RESTful api 的 Javascript Web 应用程序 (SPA)。在我的客户端数据上下文中,我想将对象添加到我的模型图中,然后将整个图一次发送到服务器。

假设以下示例:

我的模型中有一个Person对象,它本身有一个 say 数组PhoneNumbers作为属性。现在我Person从 api 加载一个用于编辑并将其映射到我的模型。假设我想将一些电话号码对象添加到我的PhoneNumbers. 为此,我将每个数字(例如{"id": 0, "number": 6536652226}id 为零)添加到我的客户端模型中,并在用户单击保存时将整个图形发送到服务器。在服务器中,我将 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 都为零!

有什么建议可以解决这个问题,还是我需要一种完全不同的方法?

4

2 回答 2

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"
}

}

当然,如果他们仍然没有 ID,您将无法通过 ID 找到号码。您需要选择:

  • 从数据库中检索生成的 ID 并更新您的本地数据
  • 按编号删除
于 2013-03-04T15:59:08.917 回答
0

localId在新创建的客户端对象上创建一个属性,并在协调服务器返回的数据时将其用作您的键。显然,服务器必须将其返回localId给您。

于 2013-03-04T15:57:53.443 回答