2016-07-25 2 views
2

Depuis les guides-Ember explique comment charger mutliple modèles sur une route comme celleember.js: charge plusieurs modèles liés

export default Ember.Route.extend({ 
    model() { 
    return Ember.RSVP.hash({ 
     songs: this.get('store').findAll('song'), 
     albums: this.get('store').findAll('album') 
    }); 
    } 
}); 

Im se demandant comment charger uniquement les modélistes entrées liées d'une seconde, comme le chargement de tous les morceaux, mais seulement les albums qui sont indexées dans les chansons si nous supposons que le modèle de la chanson contenant ce

... 
albums: hasMany('album'), 
... 

Comment puis-je faire cela?

+0

Vous devez charger les albums avec les morceaux, ou obtenir les morceaux dans le modèle de crochet et interroger les albums dans le crochet afterModel en utilisant les identifiants de chanson que vous avez obtenus du modèle –

Répondre

2

En supposant que votre adaptateur et JSON support back-end API, vous pouvez simplement dire:

export default Ember.Route.extend({ 
    model() { 
    return Ember.RSVP.hash({ 
     songs: this.get('store').findAll('song', { include: 'albums' }), 
    }); 
    } 
}); 

En général, cela va générer un GET-/songs?include=albums, qui indique le backend API JSON pour inclure les ressources album liées, selon à http://jsonapi.org/format/#fetching-includes.

Sur le côté Ember des choses, cette fonctionnalité est documentée à http://emberjs.com/blog/2016/05/03/ember-data-2-5-released.html#toc_code-ds-finder-include-code.

Si ce qui précède n'est pas une option, il est impossible de charger tout en une seule requête sans créer de point de terminaison personnalisé et en utilisant store.pushPayload.

0

Voici une façon de le faire

export default Ember.Route.extend({ 
    model() { 
    var promise = new Ember.RSVP.Promise(function(resolve,reject){ 
     this.store.findAll('song').then(function(songs){ 
     var albumPromises = songs.map(fuction(s){return s.get('album')}); 
     Em.RSVP.all(albumPromises).then(function(){ 
      resolve(songs); 
     }); 
     }); 
    }); 
    return promise; 
    } 
}); 

donc en gros vous attendez jusqu'à ce que tout est résolu.

Hope it helps!

+0

songs.map (fuction (s) {return s .get ('album')}); -> Est-ce que cette explication de Promesse est requise pour vos réponses pour une meilleure compréhension. – kumkanillam

+1

oui s.get ('album') renverra la promesse parce que c'est une relation qui sera chargée plus tard. –