2017-01-31 2 views
1

Es ist ein weithin bekannter Ansatz Laden mehr als ein Modell Versprechen in einem Ember Weg zu unterstützen, mit Ember.RSVP.hash:Feinabstimmung erfrischend mehrere Modelle in Ember Route

// app/routes/posts.js 

export default Ember.Route.extend({ 

    model(params) { 
    return Ember.RSVP.hash({ 
     posts: this.store.findAll('post', params), 
     tags: this.store.findAll('tag', params), 
    }); 
    }, 

}); 

Jetzt habe ich einen page param, zu sein Sie können die Posts in Stapeln laden, anstatt sie zu laden und auf einmal anzuzeigen. Durch Seitenänderungen werden die Tags jedoch nicht geändert. Wenn sich der Seitenparameter jedoch ändert, wird das gesamte Modell der Route erneut zum erneuten Laden ausgelöst, was dazu führt, dass die App sowohl die Posts für die neue Seite als auch die gleichen Tags erneut abholt.

Gibt es eine Möglichkeit zur Feinabstimmung, damit die Tags nicht geladen werden, wenn sich bestimmte Parameter ändern?

Antwort

1

Es gibt mehrere Möglichkeiten, Ihren Code zu refactozieren. Wie das Verschieben von Tags aus dem Modell. Oder die Seitennummerierung anders durchführen (ohne Modellaktualisierung). Der eine, den ich mag, schreibt ein benutzerdefiniertes getAll-Dienstprogramm.

var cache = {}; // model_name => Promise<[Record]> 

function getAll(store, model) { 
    if(!store.modelFor(model).cacheable) { 
     return store.findAll(model); 
    } 

    if(!cache[model]) { 
     cache[model] = store.findAll(model); 
    } 

    return cache[model]; 
} 

Und jetzt in Ihrem Modell

import { getAll } from 'utils/store'; 
... 
tags: getAll('tag'), 
+0

Die Sache ist, in dem aktuellen Szenario in Ich bin vor (was nicht die Beiträge und Tags Beispiel natürlich ist) eine der Teilmodell geholt Die 'Ember.RSVP.hash' hängt davon ab, dass einige, aber nicht alle Routenparameter geändert wurden. Der andere hängt davon ab, dass sich irgendein Parameter geändert hat. Also brauche ich noch das Modell hook 'params', um das zweite Submodell zu holen. Ich will nur nicht, dass es erneut abgerufen wird, wenn der Parameter, der sich geändert hat, nicht das Ergebnis beeinflusst. – Ernesto

+1

Nun, Sie könnten das oben angegebene Beispiel entsprechend Ihren Bedürfnissen modifizieren. Fügen Sie ein zusätzliches Argument hinzu, um Eigenschaften (Params) zu cachen. Wenn param gleich ist und der Modellname der gleiche ist, dann nehmen Sie den Cache, andernfalls laden Sie neu. –

+0

@Ernesto irgendeinen Erfolg? –