我已经看过这个问题,但我仍然遇到将Mongo的_id
处理成id
的问题。我使用mongoose作为我的ORM,虽然它有虚拟,我似乎无法让它正常工作。以下是我在猫鼬模型中的内容。
尝试从后端修复
mongoose = require 'mongoose'
Schema = mongoose.Schema
ObjectId = Schema.ObjectId
ApartmentSchema = new Schema
body: String
date: { type: Date, default: Date.now }
deleted: {type: Boolean, default: false}
saved: {type: Boolean, default: false}
visited: {type: Boolean, default: false}
email: String
phoneNumber: String
href: String
ApartmentSchema.virtual('id').get -> return @_id
module.exports = mongoose.model 'Apartment', ApartmentSchema
当我在Express中创建此模型的新实例时,我可以查看apt.id
并获取ID,但当我将响应发送到客户端时,我只有_id
而不是id
。
我尝试的第二个解决方案是为id
创建一个计算属性,但无论出于什么原因,ember都不喜欢这个。这里有两个问题。 Ember不尊重名为id
的计算属性或至少不再尊重。这就是我的余烬数据模型。
尝试从前端修复
App.Apartment = DS.Model.extend({
body: DS.attr('string'),
date: DS.attr('date'),
deleted: DS.attr('boolean'),
saved: DS.attr('boolean'),
visited: DS.attr('boolean'),
email: DS.attr('string'),
phone: DS.attr('string'),
_id: DS.attr('string'),
id : function () {
return this.get('_id')
}.property('_id')
});
在我的下面的模板中,没有任何呈现ID。
{{#each apartment in controller}}
<li>{{apartment.body}} | {{apartment.date}} | {{apartment.href}} {{apartment.id}}</a> {{#linkTo 'apartment' apartment }} View {{/linkTo}} </li>
{{/each}}
linkTo
帮助程序可以正常工作,但是url在id应该是null的位置。这导致后退按钮断开并多次加载数据。以下是我的路由器的一些上下文。
App.Router.map(function(){
this.resource('apartments', function (){
this.resource('apartment', { path: ':apartment_id' } );
});
});
将我计算的id
属性的名称更改为foo
,然后将路由器更改为path: ':apartment_foo'
会导致在网址中包含对象引用的网址,例如:{{1 }}
就像这样的东西让我想起了余烬。任何帮助,将不胜感激。
答案 0 :(得分:9)
从Ember 1.0.0-rc 1和Ember Data第11版开始,这似乎是解决此问题的最佳方法。
App.Adapter = DS.RESTAdapter.extend({
serializer: DS.RESTSerializer.extend({
primaryKey: function(type){
return '_id';
}
})
});
App.Store = DS.Store.extend({
revision: 11,
adapter: 'App.Adapter'
});
答案 1 :(得分:7)
截至Ember Data - 版本:v1.0.0-beta.2,我能够做到以下几点:
App.ApplicationSerializer = DS.RESTSerializer.extend({
primaryKey: "_id"
});
我对Ember很新,所以这可能不是最好的方法,但它有效!
答案 2 :(得分:5)
我遇到了与Chris相同的问题,其ID看起来像这样:
"_id":{"$oid":"52772aa44f6c6c5dd0000000"}
将$ oid部分添加到claptimes的解决方案对我有用。
App.ApplicationSerializer = DS.RESTSerializer.extend({
primaryKey: "_id.$oid"
});
答案 3 :(得分:2)
自迁移到Ember-CLI以来,此过程略有改变。你现在想要这样做:
从Ember-CLI项目命令行:
ember g serializer application
让新创建的序列化程序如下所示:
import DS from 'ember-data';
export default DS.RESTSerializer.extend({
primaryKey: '_id'
});
答案 4 :(得分:0)
从Ember 2.0.0开始,标准化Mongo ID的正确方法是使用序列化程序中的extractId
。以下是针对Rails / Grape API运行的RESTSerializer的示例:
import DS from 'ember-data';
export default DS.RESTSerializer.extend({
isNewSerializerAPI: true,
extractId: function (modelClass, resourceHash) {
return resourceHash.id.$oid;
}
});
请注意,您必须将isNewSerializerAPI
设置为true
才能生效。
根据您的需要,您可以尝试更改为resourceHash._id.$id
或其他适合您的工作。如果您不确定,请尝试console.log(resourceHash)
检查数据。