2013-10-12 19 views
16

Ich habe zwei Modelle, die viele zu viele sind. Sie werden auf der ersten Seite meiner App verwendet und ich kann sie nicht laden.Anfrage zwei Modelle zusammen

Beide Modelle haben nur eine Handvoll Artikel (< 200) und ich möchte nur beide Modelle komplett in eine findAll Anfrage laden. Aber als das erste Modell geladen wird, beginnt Ember, die fehlenden Daten für das zweite Modell Stück für Stück zu holen. Wenn ich versuche, die Modelle separat zu laden, erhalte ich einen Fehler und muss {async:true} für den hasMany attr. Aus irgendeinem Grund erkennt Ember den JSON der Anfragen für das zweite Modell nicht.

Gibt es auf jeden Fall beide Modelle abzuholen und zu warten, bis beide geladen sind, bevor Sie fortfahren?

Danke.

Antwort

43

Ich vermute, Sie von etwas entlang der Linien tun:

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) 
    }); 
    } 
}); 

Alle Versprechen aus dem model Haken der Route zurückgekehrt, führt dazu, dass der Router den Übergang zu pausieren, bis das Versprechen erfüllt ist. Im obigen Fall wartet der Router nur für die posts Anfrage zu lösen. Daher müssen wir den Router anweisen, auf die Beendigung beider Anfragen zu warten. Geben Sie Ember.RSVP.all und Ember.RSVP.hash ein. Diese Methoden ermöglichen das Zusammenführen mehrerer Versprechen zu einem. Sie geben ein neues Versprechen ab, das nur dann erfüllt wird, wenn alle individuellen Versprechen erfüllt sind. Hier ist, wie Sie es mit Ember.RSVP.hash tun:

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

Vielen Dank! Das funktioniert super !! Entschuldigung, dass Sie kein Codebeispiel angegeben haben. Ich benutze die Modelle tatsächlich in zwei verschiedenen Render-Helfern, jeder mit seinem eigenen Controller. Aus irgendeinem Grund, wenn es zu diesen Controllern kommt, läuft das Versprechen wieder? Ich dachte, dass ein Teil von Ember-Daten ist, dass es Cache-Daten lädt? Sollte ich etwas anders machen? – NicholasJohn16

+0

@ NicholasJohn16 können Sie etwas Code schreiben? –

+6

Wie funktioniert das bei '# link-to', wo der' model'-Hook nicht aufgerufen wird? – jaketrent