Я не эксперт по Ember, но думаю, что вы можете решить свою проблему с помощью чистого решения JS.
Данные запроса Ember Data возвращают обещания, например. return this.store.findAll('blog-post'); // => Promise
, мы можем кэшировать обещания в простом объекте с функциями более высокого порядка (функции, возвращающие функции). Кэш объектов можно было бы заменить на localStorage
, sessionStorage
, Map
или даже WeakMap
, но я использую кеш-объект, чтобы сделать вещи простыми для понимания.
То, что вы хотите, чтобы по существу сделать, это заменить следующий вызов:
return this.store.findAll('blog-post');
с чем-то более или менее, как:
return cachedStore.findAll('blog-post');
на самом деле, с решением ниже может выглядеть как:
return cachedStore.call(this, 'findAll', 'blog-post');
В результате вы будете запрашивать данные один раз и всегда возвращаться из кеша в s последующие звонки.
Позвольте мне показать вам, как реализация может выглядеть следующим образом:
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];
};
}());
А вот использование пример:
// 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);
ли, что помощь в любом случае?
Где вы используете кеш, то есть на конкретном маршруте, и кеш будет очищен при повторном запуске запроса или есть переход от маршрута? – aceofspades
есть переход от маршрута.Вариант использования заключается в том, что я показываю список результатов поиска, пользователь нажимает на результат и переходит к странице подробностей. если он вернется, я не хочу повторно запускать поиск, который стоит почти 5 секунд. – Lux
Я перехватываю крючки 'setupController' и' deactivate' маршрута, где я беру ссылку на контроллер и записываю в него полные записи. В моем случае я уничтожаю их, когда я перехожу, поэтому вам придется подумать о том, как инициировать отложенную очистку. Я считаю, что он принадлежит к маршруту/контроллеру, а не к адаптеру, который является более абстрактным/глобальным. Таким образом, он содержится для конкретной функции (поиска). – aceofspades