Non sono un esperto di Ember ma penso che sia possibile risolvere il problema con una soluzione JS pura.
Dati restituiti da Ember Data restituiscono Promises, ad es. return this.store.findAll('blog-post'); // => Promise
, è possibile memorizzare le promesse nella cache in un oggetto semplice con funzioni di ordine superiore (funzioni che restituiscono funzioni). La cache degli oggetti potrebbe essere sostituita con localStorage
, sessionStorage
, Map
o anche WeakMap
ma sto utilizzando la cache degli oggetti per semplificare le cose.
Che cosa si vuole essenzialmente fare è sostituire seguente chiamata:
return this.store.findAll('blog-post');
con qualcosa di più o meno come:
return cachedStore.findAll('blog-post');
in realtà, con la soluzione qui di seguito potrebbe apparire più simile a:
return cachedStore.call(this, 'findAll', 'blog-post');
Di conseguenza, si richiederà una volta i dati e si ritornerà sempre dalla cache in s chiamate successive.
mi permetta di mostrare come l'implementazione potrebbe essere simile:
var cachedStore = (function() {
// Your cache - in this case simple object literal
var cache = {};
// Actual method that will check cache for results before trying to query services
return function (method) {
var args = Array.prototype.slice.call(arguments, 1);
var serializedArgs = JSON.stringify(args);
if (!(serializedArgs in cache)) {
cache[serializedArgs] = this.store[method].apply(this, args);
}
return cache[serializedArgs];
};
}());
Ed ecco un esempio dell'uso:
// Fires a request
cachedStore.call(this, 'findAll', 'blog-post');
// Returns from cache
cachedStore.call(this, 'findAll', 'blog-post');
// Returns from cache
cachedStore.call(this, 'findAll', 'blog-post');
// Fires a request
cachedStore.call(this, 'findRecord', 'blog-post', 123);
// Returns from cache
cachedStore.call(this, 'findRecord', 'blog-post', 123);
// Returns from cache
cachedStore.call(this, 'findRecord', 'blog-post', 123);
Ritiene che l'aiuto in qualche modo?
Dove stai utilizzando la cache, ad esempio su una particolare rotta, e la cache verrebbe cancellata quando la query è stata rieseguita o c'è una transizione dalla rotta? – aceofspades
c'è una transizione dal percorso.Il caso d'uso è che visualizzo un elenco di risultati di ricerca, l'utente fa clic su un risultato e passa alla pagina dei dettagli. se torna indietro non voglio rieseguire la ricerca che costa quasi 5 secondi. – Lux
Mi aggancio nei ganci 'setupController' e' deactivate' del percorso, dove prendo un riferimento al controller e memorizzo i record completi. Nel mio caso li distruggo quando esco, quindi dovresti considerare come attivare una pulizia posticipata. Credo che appartenga alla route/controller, piuttosto che all'adattatore che è più di una cosa astratta/globale. In questo modo è contenuto per la funzione specifica (ricerca). – aceofspades