8

我已经看到过这个问题,但我仍然对将 Mongo 处理_idid. 我使用 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 都不喜欢这样。这里有2个问题。Ember 不尊重被称为id或至少不再尊重的计算属性。这就是我的 ember-data 模型的样子。

尝试从前端修复它

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'在 url 中具有对象引用的 url,例如:#/apartments/<App.Apartment:ember357:null>.

正是这样的东西让我对 ember 感到不安。任何帮助,将不胜感激。

4

5 回答 5

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'
});
于 2013-03-12T18:09:55.117 回答
7

从 Ember Data - 版本:v1.0.0-beta.2 开始,我能够做到以下几点:

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

我对 Ember 很陌生,所以这可能不是最好的方法,但它确实有效!

于 2013-09-25T17:10:04.483 回答
5

我和 Chris 有同样的问题,id 看起来像这样:

"_id":{"$oid":"52772aa44f6c6c5dd0000000"}

将 $oid 部分添加到 claptimes 的解决方案对我有用。

App.ApplicationSerializer = DS.RESTSerializer.extend({
  primaryKey: "_id.$oid"
});
于 2013-11-06T03:58:53.460 回答
2

自从迁移到 Ember-CLI 后,这个过程略有改变。你现在想要这样做:

  1. 从 Ember-CLI 项目命令行:

    ember g serializer application
    
  2. 使您新创建的序列化程序如下所示:

    import DS from 'ember-data';
    
    export default DS.RESTSerializer.extend({
      primaryKey: '_id'
    });
    
于 2015-04-07T02:50:29.717 回答
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;
  }
});

请注意,您必须设置isNewSerializerAPItrue才能正常工作。

根据您的需要,您可以尝试更改为resourceHash._id.$id或其他任何适合您的方法。如果您不确定,请尝试console.log(resourceHash)检查数据。

于 2015-08-22T23:05:02.457 回答