0

当使用 RESTAdapter 创建和保存新模型时,它的 Id 属性是未定义的,因为我的后端负责 id 生成。因此,当我返回网格时,有两个相同的实体:第一个 - 具有空 ID(我认为来自 RESTAdapter 缓存),第二个 - 具有从后端返回的正确 ID。

有任何想法吗?也许可以禁用 RESTAdapter 缓存?

更新

我的实体创建代码。

    submit:function () {
        var manager = App.store.createRecord(App.Manager, {
            firstName:this.get('firstName'),
            lastName:this.get('lastName'),
            speciality:this.get('speciality')
        });

        App.store.commit();

        this.get('controller').transitionTo('managers');
        return false;
    }

新更新

感谢 Mike Grassotti 的提示。这里有一些关于我的问题的细节。

  1. 一个对立有身份,另一个没有身份。
  2. 如果我删除 App.store.commit() 代码,则不会向服务器发送 POST,只会显示没有 ID 的实体。
  3. 此实体具有 isLoaded=false 和 isError=true。
4

2 回答 2

3

当使用 RESTAdapter 创建和保存新模型时,它的 Id 属性是未定义的,因为我的后端负责 id 生成。

没错,但这并没有什么不寻常的地方——ember 期望 id 生成由后端完成。

因此,当我返回网格时,有两个相同的实体:第一个 - 具有空 ID(我认为来自 RESTAdapter 缓存),第二个 - 具有从后端返回的正确 ID。

好的。相同的 2 个实体是什么意思- 它们肯定是不同的 js 对象。尝试将它们中的每一个记录到控制台,如下所示:

console.log(entityOne.toString());
console.log(entityTwo.toString());

有任何想法吗?

有很多事情可能导致这种情况发生。听起来您以某种方式创建了两条新记录并仅保存其中一条。或者可能是 API 响应与 ember 期望的不匹配,导致创建了额外的记录。

  • 尝试启用记录您的记录,然后观察控制台,以便您可以看到保存模型时发生的情况。希望这能让您深入了解何时/如何创建额外记录。

    record.set("stateManager.enableLogging", true)

  • 检查浏览器与您的 api 的通信并比较 JSON 以查看它是否与ember rest 适配器所期望的匹配。

  • 将 JSON 和其余的源代码(模型定义等)发布到 Stack Overflow,也许第二双眼睛会有所帮助。

  • 查看这篇文章了解其他一些调试技巧:http ://www.akshay.cc/blog/2013-02-22-debugging-ember-js-and-ember-data.html

也许可以禁用 RESTAdapter 缓存?

RESTAdapter 不维护模型对象的单独缓存。而且由于您没有尝试做任何特别的事情,因此没有必要采取那样的步骤。

于 2013-03-15T07:00:33.377 回答
0

非常感谢 Mike Grassotti,我找到了问题的答案。

好问题是

使用 App.store.commit() 后,来自服务器的 JSON 响应是什么样的?

对该评论 +1。

我在 ember-data 文档中找不到任何信息,所以一些链接仍然对我有帮助。我更改了从后端返回的结果,现在一切正常。

{
  "manager": {
    "firstName": "test",
    "lastName": "test",
    "speciality": "test",
    "id": "acd325ac-03eb-419e-be8a-d4ac42e8c235"
  }
}
于 2013-04-10T04:39:39.870 回答