Подтвердить что ты не робот

Кэширование удаленных данных в локальном хранилище с помощью 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

Я очень надеюсь, что это реальный вопрос о нобе и что для этого есть хороший шаблон.

Обновлено: Нашел этот похожий вопрос. У этого есть хороший ответ, но он как бы теоретический. Я думаю, что мне понадобятся некоторые практические советы или указатели на примеры реализации.

4b9b3361

Ответ 1

Просто, чтобы немного "поднять" эту тему, потому что это был один из лучших результатов, когда я исследовал решения для локального кэша ember restful api и т.д.:

Дэн Гебхардт, похоже, делает чертовски хорошую работу с Orbit.js и его интеграцией в Ember: https://github.com/orbitjs/ember-orbit

Орбита - это автономная библиотека для координации доступа к источникам данных и , сохраняя их содержимое синхронизированным.

Orbit обеспечивает основу для создания дополнительных функций в клиентские приложения, такие как автономная работа, обслуживание и синхронизация локальных кешей, откат/повтор стеков и редактирование ad hoc контексты.

Возможности Orbit.js:

  • Поддержка любого количества различных источников данных в приложении и предоставление доступа к ним через общие интерфейсы.

  • Разрешить выполнение запросов различными источниками, включая возможность задания приоритетных и резервных планов.

  • Разрешить записи одновременно в разных состояниях через источники.

  • Преобразование координат между источниками. Ручка объединяется автоматически, когда это возможно, но допускает полный пользовательский контроль.

  • Разрешить блокировку и неблокирующие преобразования.

  • Разрешить синхронные и асинхронные запросы.

  • Поддерживать транзакции и отменять/повторять, отслеживая обратные операции.

  • Работа с объектами обычного JavaScript.

И не пропустите его великую речь и слайды о Орбите:
Введение в Orbit.js

(UPDATE). Я добавил еще одну описательную информацию с страниц Orbit, так как моя публикация была опущена для "просто", ссылаясь на внешние ресурсы и не содержала фактического решения сама по себе. Но мне кажется, что Orbit как решение, и единственный способ "включить" это здесь через ссылки.)

Ответ 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));
    }
  }
});