2013-10-12 19 views
16

Ho due modelli che sono molti per molti. Sono utilizzati nella prima pagina della mia app e ho difficoltà a caricarli.Richiedi due modelli insieme

Entrambi i modelli hanno solo una manciata di articoli (< 200) e mi piacerebbe caricare entrambi i modelli completamente in una richiesta findAll ciascuno. Ma quando viene caricato il primo modello, Ember inizia a recuperare i dati mancanti per il secondo modello, articolo per articolo. Se provo a caricare solo i modelli separatamente, ricevo un errore e devo impostare {async:true} per il hasMany attr. Per qualche ragione, però, Ember non riconosce il json delle richieste per il secondo modello.

È comunque necessario recuperare entrambi i modelli e attendere fino a entrambi i carichi prima di continuare?

Grazie.

risposta

43

Sto indovinando si sta facendo qualcosa sulla falsariga di:

App.IndexRoute = Ember.Route.extend({ 
    model: function() { 
    // Fetch the records of the first model 
    return this.store.find('post'); 
    }, 

    setupController: function(controller, model) { 
    this._super(controller, model); 
    this.store.find('comment').then(function(comments) { 
     controller.set('comments', comments) 
    }); 
    } 
}); 

Ogni promessa è tornato dal gancio model del percorso, farà sì che il router per mettere in pausa la transizione fino a quando si compie la promessa. Nel caso precedente, il router attenderà solo per la richiesta di risoluzione posts. Pertanto, dobbiamo istruire il router ad attendere il completamento di entrambe le richieste.

Immettere Ember.RSVP.all e Ember.RSVP.hash. Questi metodi consentono di unire più promesse in uno. Restituiscono una nuova promessa che si realizza solo quando tutte le promesse individuali sono soddisfatte. Ecco come lo fai con :

App.IndexRoute = Ember.Route.extend({ 
    model: function() { 
    var store = this.store; 
    return Ember.RSVP.hash({ 
     posts: store.find('post'), 
     comments: store.find('comment') 
    }); 
    }, 

    setupController: function(controller, models) { 
    var posts = models.posts; 
    var comments = models.comments; 

    controller.set('content', posts); 
    controller.set('comments', comments); 
    } 
}); 
+1

Grazie mille! Funziona benissimo !! Ci scusiamo per non aver fornito un esempio di codice. In realtà sto usando i modelli in due diversi aiutanti di rendering, ognuno con il proprio controller. Per qualche ragione, quando arriva a quei controllori, sta facendo di nuovo la promessa? Ho pensato che parte dei dati di Ember è che carica i dati della cache? Dovrei fare qualcosa di diverso? – NicholasJohn16

+0

@ NicholasJohn16 puoi pubblicare del codice? –

+6

Come funziona nel caso di '# link-to', dove l'hook' model' non viene chiamato? – jaketrent