0

Ember-Model の belongsTo に追加のパラメーターを渡す必要があります。独自の属性タイプで動作するようにしました。しかし、私も関係を築く必要があります。それはどういうわけか可能ですか?

UserType = {
  serialize: function(objectId) {
    return {
      __type: 'Pointer',
      className: '_User',
      objectId: objectId
    };
  },

  deserialize: function(object) {
    return object.objectId;
  }
};

App.Movie = Ember.Model.extend({
  objectId: Ember.attr(),

  createdAt: Ember.attr(),
  updatedAt: Ember.attr(),

  owner: Ember.attr(UserType),
  // owner: Ember.belongsTo('App.User', {
  //   key: 'objectId'
  // }),
});

App.User = Ember.Model.extend({
  objectId: Ember.attr(),
  username: Ember.attr(),
  email: Ember.attr(),

  createdAt: Ember.attr(),
  updatedAt: Ember.attr(),
});

App.User.primaryKey = 'objectId';

映画の JSON は次のとおりです。

{
  "ratings": [
    {
      "objectId": "AQWYN32UUo",
      "value": 4
    }
  ],
  "title": "Inception",
  "watched": true,
  "year": "2010",
  "owner": {
    "__type": "Pointer",
    "className": "_User",
    "objectId": "AQWYN32UUo"
  },
  "createdAt": "2013-11-28T15:38:40.730Z",
  "updatedAt": "2013-11-28T15:55:37.114Z",
  "objectId": "0x5tdCcWiy"
},

ありがとうございました

4

1 に答える 1

0

getBelongsTo と s をオーバーライドする必要があります。

これはデフォルトの実装です

Ember.Model.reopen({
  getBelongsTo: function(key, type, meta) {
    var idOrAttrs = get(this, '_data.' + key),
        record;

    if (Ember.isNone(idOrAttrs)) {
      return null;
    }

    if (meta.options.embedded) {
      var primaryKey = get(type, 'primaryKey');
      record = type.create({ isLoaded: false });
      record.load(idOrAttrs[primaryKey], idOrAttrs);
    } else {
      record = type.find(idOrAttrs);
    }

    return record;
  }
});

serializeBelongsTo: function(key, meta) {
  if (meta.options.embedded) {
    var record = this.get(key);
    return record ? record.toJSON() : null;
  } else {
    var primaryKey = get(meta.getType(), 'primaryKey');
    return this.get(key + '.' + primaryKey);       
  }
}

このようなものに変更できます

owner: Ember.belongsTo('App.User', {key: 'owner', serializer:UserType}),


Ember.Model.reopen({
  getBelongsTo: function(key, type, meta) {
    var idOrAttrs = get(this, '_data.' + key),
        record;

    if (Ember.isNone(idOrAttrs)) {
      return null;
    }

    // THIS IS NEW
    if (meta.options.serializer){
      idOrAttrs = meta.options.serializer.deserialize(idOrAttrs);
    }

    if (meta.options.embedded) {
      var primaryKey = get(type, 'primaryKey');
      record = type.create({ isLoaded: false });
      record.load(idOrAttrs[primaryKey], idOrAttrs);
    } else {
      record = type.find(idOrAttrs);
    }

    return record;
  },

  serializeBelongsTo: function(key, meta) {
    if (meta.options.embedded) {
      var record = this.get(key);
      return record ? record.toJSON() : null;
    } else {

      // THIS IS NEW
      if(meta.options.serializer){
        return meta.options.serializer.serialize(record);
      }
      var primaryKey = get(meta.getType(), 'primaryKey');
      return this.get(key + '.' + primaryKey);
    }
  }


});
于 2013-11-28T18:58:20.100 に答える