How do I load two models in one JSON request in Em

2019-03-21 10:34发布

问题:

Using Ember-data and Ember.js, I'm trying to load two models with one JSON request. The models have a relationship analogous to this:

App.Person = DS.Model.extend({
    name:  DS.attr('string'),
    dogs:  DS.hasMany('App.Dog'),
});

App.Dog = DS.Model.extend({
    name:  DS.attr('string'),
    owner: DS.belongsTo('App.Person'),
});

My server is sending JSON like this:

{
    "dog": {
        "id": 1,
        "name": "Fido",
        "owner": {
            "id": 1,
            "name": "John Smith",
            "dogs": [1]
        }
    }
}

…And yet, Ember-data still sends a request (using findQuery) to my server trying to get the owner JSON.

I have a jsFiddle set up that demonstrates it here. To watch the problem happen, you'll need to go to this link to activate the route/template:

http://fiddle.jshell.net/6kQ8s/2/show/#/dog/1

I haven't defined findQuery() in my adapter on purpose because I shouldn't need that to get data that I have already sent… Right?

Does anyone know what I'm doing wrong here?

回答1:

I'm doing the following (using ember-data revision 8)

App.Dog = DS.Model.extend({
    name:  DS.attr('string'),
    owner: DS.belongsTo('App.Person', { embedded: true }),
});

Additionally, I have to tell the serializer to load a mapping for this relation. Though it's not required, I'm using my own DS.Serializer subclass. At initialisation time the serializer loads a mapping for the Person class, which specifies that embedded relationships should be loaded.

  App.WOSerializer = DS.Serializer.extend({
    init: function(){
      this._super();
      this.map(App.Dog, {
        person: {
          embedded: 'load'
        }
      });
  });

Edit by question asker:

The serializer needed to be initialized in the adapter.

App.adapter = DS.Adapter.create({
    // ...
    serializer: App.WOSerializer.create()
});


回答2:

Try use embedded property.

App.Dog = DS.Model.extend({
    name:  DS.attr('string'),
    owner: DS.belongsTo('App.Person', { embedded: true }),
});