Кэширование удаленных данных в локальном хранилище с помощью EmberData
У меня вопрос о загрузке и кешировании удаленных объектов с помощью Ember. Я разрабатываю приложение Ember, которое использует серверное хранилище через REST API. Некоторые из извлеченных данных редко меняются, поэтому выборки с сервера каждый раз, когда загружается приложение, не требуется. Но это также вопрос для приложений, которые должны работать в автономном режиме и до сих пор сохранять свои данные на сервере.
У Ember Data есть встроенный адаптер хранения для сохраняющихся моделей через REST API, а также адаптер для локального хранилища (как указал Кен ниже). Проблема (если это проблема) заключается в том, что модель имеет только один адаптер для хранения, и, похоже, нет никакой концепции кэширования извлеченных моделей, кроме сохранения их в памяти.
Я нашел похожие запросы в этом Ember wishlist и в комментариях к этому от Tom Dale, но я не нашел никаких указаний на то, что это была бы существующая функция в Ember.
У меня есть два вопроса (первый из которых является важным):
- Каков наилучший способ - сегодня - реализовать кэшированные модели в локальном хранилище и синхронизировать их с удаленными данными по мере необходимости?
- Является ли это функцией, которую планируется включить в Ember, или, по крайней мере, что-то, что должно быть добавлено сопровождением, в конечном итоге должно быть добавлено?
Когда дело доходит до 1), я могу придумать пару стратегий:
a) Расширьте существующий адаптер и добавьте настраиваемый механизм удаленной синхронизации:
App.Store.registerAdapter('App.Post', DS.LSAdapter.extend({
// do stuff when stuff happens
}));
b) Поддерживать отдельные классы моделей - один набор для удаленных объектов и один набор для локальных объектов - и синхронизировать между ними по мере необходимости. Со стандартным корпусом Todo:
RemoteTodo –*sync*– Todo
|
UI
Я очень надеюсь, что это реальный вопрос о нобе и что для этого есть хороший шаблон.
Обновлено: Нашел этот похожий вопрос. У этого есть хороший ответ, но он как бы теоретический. Я думаю, что мне понадобятся некоторые практические советы или указатели на примеры реализации.
Ответы
Ответ 1
Просто, чтобы немного "поднять" эту тему, потому что это был один из лучших результатов, когда я исследовал решения для локального кэша ember restful api и т.д.:
Дэн Гебхардт, похоже, делает чертовски хорошую работу с Orbit.js и его интеграцией в Ember:
https://github.com/orbitjs/ember-orbit
Орбита - это автономная библиотека для координации доступа к источникам данных и , сохраняя их содержимое синхронизированным.
Orbit обеспечивает основу для создания дополнительных функций в клиентские приложения, такие как автономная работа, обслуживание и синхронизация локальных кешей, откат/повтор стеков и редактирование ad hoc контексты.
Возможности Orbit.js:
-
Поддержка любого количества различных источников данных в приложении и предоставление доступа к ним через общие интерфейсы.
-
Разрешить выполнение запросов различными источниками, включая возможность задания приоритетных и резервных планов.
-
Разрешить записи одновременно в разных состояниях через источники.
-
Преобразование координат между источниками. Ручка объединяется автоматически, когда это возможно, но допускает полный пользовательский контроль.
-
Разрешить блокировку и неблокирующие преобразования.
-
Разрешить синхронные и асинхронные запросы.
-
Поддерживать транзакции и отменять/повторять, отслеживая обратные операции.
-
Работа с объектами обычного JavaScript.
И не пропустите его великую речь и слайды о Орбите:
Введение в Orbit.js
(UPDATE). Я добавил еще одну описательную информацию с страниц Orbit, так как моя публикация была опущена для "просто", ссылаясь на внешние ресурсы и не содержала фактического решения сама по себе. Но мне кажется, что Orbit как решение, и единственный способ "включить" это здесь через ссылки.)
Ответ 2
Существует реализация локального адаптера хранения, который может оказаться полезным. Посмотрите https://github.com/rpflorence/ember-localstorage-adapter
Ответ 3
Вот способ сделать это. Смеситель для ваших адаптеров, с помощью метода localStoreRecord
, вы можете использовать для кэширования записи, и, наконец, инициализатор для предварительной загрузки хранилища.
Локальное хранилище - это просто хранилище ключей: значение для строковых объектов, поэтому мы можем хранить все данные наших приложений под одним ключом.
Примечание: здесь используются модули es6
// app/mixins/local-storage.js
import Ember from 'ember';
export default Ember.Mixin.create({
appName: 'myApp',
// how many records per model to store locally, can be improved.
// needed to prevent going over localStorage 5mb limit
localStorageLimit: 5,
localStoreRecord: function(record) {
var data = JSON.parse(localStorage.getItem(this.appName));
data = data || {};
data[this.modelName] = data[this.modelName] || [];
var isNew = data[this.modelName].every(function(rec) {
rec.id !== record.id;
});
if (isNew) {
data[this.modelName].push(record);
if (data[this.modelName].length > this.localStorageLimit) {
data[this.modelName].shift();
}
localStorage.setItem(this.appName, JSON.stringify(data));
}
}
});