14

在过去的几天里,我一直在努力使用主键和 Ember Data 的最新版本。

我首先在 GitHub上的 Breaking Changes 文件中阅读了如何做到这一点,但它显然已经过时了。我尝试 其他 几种方法(在 IRC 上的 Peter Wagenet 的帮助下),但它们似乎都不起作用。

我想slug在我的模型上创建我的主键,而且由于我正在使用 MongoDB,我想使用_id而不是id.

有没有人想出如何做到这一点?我的根本问题是,当我在模型上执行几次时,模型记录会被加载两次App.MyModel.find()

4

5 回答 5

9

从 Ember Data 1.0 beta 开始,您primaryKey在相应的序列化程序上定义。

对于整个应用程序

App.ApplicationSerializer = DS.RESTSerializer.extend({
  primaryKey: '_id'
});

对于单一类型

App.FooSerializer = DS.RESTSerializer.extend({
  primaryKey: '_id'
});

您仍将id在模型上引用它,但 Ember Data 将_id在传输期间对其进行序列化/反序列化。

示例:http ://emberjs.jsbin.com/OxIDiVU/635/edit

在此处阅读更多信息:http: //emberjs.com/api/data/classes/DS.RESTSerializer.html#property_primaryKey

于 2014-06-11T00:30:47.013 回答
3

我想让 slug 成为我模型的主键,而且由于我正在使用 MongoDB,我想使用 _id 而不是 id。

使用适配器的mapAPI 指定应该用作主键的属性:

App.Adapter.map('App.Person', {
  primaryKey: '_id'
});

有关详细信息,请参阅serializer.js api 文档。如果您需要进一步自定义记录 id 的序列化方式,请使用此处addId描述的钩子。

由于 ember-data 仍在积极开发中,因此有关此功能的文档有些有限,并且可能会在 1.0 版本之前更改。与此同时,请参阅 ember-data 测试套件以查看实际操作中的示例。例如:

于 2013-03-18T15:07:23.190 回答
1

如果 Nikita 建议的解决方案不起作用(对我来说没有使用 ember-data 的修订版 11),以下是我在使用 RESTAdapter 时更改主键的方式:

App.Adapter = DS.RESTAdapter.extend({
    serializer: "App.MySerializer"
});

// notice we extend the RESTSerializer, not Serializer!
App.MySerializer = DS.RESTSerializer.extend({
    primaryKey: function(type) {
        return '_id'; // you get it...
    }
});

我知道这可能不会再帮助 OP,但我仍然发布它,因为它可能对你们中的某些人有帮助。

于 2013-03-07T09:03:45.650 回答
0

尝试像这样扩展您的适配器:

   App.RESTSerializer = DS.RESTSerializer.extend({
      init: function() {
        this._super();

        this.map('App.MyModel', {
          primaryKey: "_id"
        });
      }
    });
于 2013-02-16T12:35:26.707 回答
0

我在我的应用程序中使用MongoDBEmber-Data 1.0.0-beta.6,并且 _id 在Ember 1.4.0中也给我带来了问题。这是我为解决问题所做的工作,假设返回的 JSON 数组嵌套在根属性“people”中:

App.ApplicationSerializer = DS.RESTSerializer.extend({
    normalizeHash: {
        people: function(hash) {
            hash.id = hash._id;
            delete hash._id;
            return hash;
        }
    }
});

当然,这是一个应用程序范围的序列化程序,但您可以将其限制为特定路径,例如App.MyPathSerializer = DS.RESTSerializer.extend({ ... });

于 2014-02-16T07:10:41.997 回答