2015-01-12 6 views
1

Я работаю над кэшированием своего хранилища данных ember-data для локального хранилища. При первой загрузке я запрашиваю, чтобы сервер загружал данные в хранилище, а затем загружал их в локальное хранилище. При последующих загрузках страницы я извлекаю данные из localstorage и загружаю их в хранилище. Я могу сделать это, используя метод pushMany.Как извлечь нормализованные данные из хранилища данных ember?

Метод pushMany магазина требует нормализованных данных. Полезная нагрузка от сервера нормализована путем передачи его через сериализатор моделей. Как только нормализованные данные хранятся в магазине, кажется разумным полагать, что можно вытащить нормализованные данные.

Итак, как вы вытаскиваете нормализованные данные из магазина?

На каждой модели есть имущество _data. Свойство '_data' работает только с плоскими моделями. Более сложные модели _data свойство содержит заданные отношения.

Я хотел бы избежать необходимости сериализации/десериализации более одного раза.

This - моя текущая реализация. Проблема с методом toJson заключается в загрузке всех ассоциаций, в том числе асинхронных отношений, которые не были разрешены. Я думаю, что существует фундаментальная проблема в отношении того, как данные ember разрешают отношения первичных/внешних ключей.

+0

Я не знаю, если это то, что вы имеете в виду, но вы можете получить записи из магазина, не делая сервер запрос с использованием всех - через http://emberjs.com/guides/models/find-records/# toc_finding-all-records-of-a-type «Чтобы получить список записей, уже загруженных в хранилище, не создавая другого сетевого запроса, используйте все вместо этого». 'var posts = this.store.all ('post');' // => нет сетевого запроса – Craicerjack

+0

вот gist https://gist.github.com/arenoir/528c4d77c9398e519984#file-local-cache- js-L47 –

+0

это работает для моделей без связей. ИМО должен быть метод для модели для извлечения необработанных нормализованных данных. –

ответ

2

Хорошей отправной точкой для вашей проблемы может быть реализация toJSON из данных ember.

Как вы упомянули, проблема с toJSON заключается в том, что она разрешает все ассоциации. Для отношений, относящихся к отношениям, легко избежать этой проблемы, используя _data, чтобы получить id связанного объекта.

customToJSON: function(record) { 
 
    var json = {}; 
 
    json.id = record.get('id'); 
 

 
    var serializer = DS.JSONSerializer.create({ container: record.container }); 
 

 
    record.eachAttribute(function(key, attribute) { 
 
    serializer.serializeAttribute(record, json, key, attribute); 
 
    }, this); 
 

 
    record.eachRelationship(function(key, relationship) { 
 
    if (relationship.kind === 'belongsTo') { 
 
     json[relationship.key] = record._data[relationship.key].id; 
 
    } 
 
    }); 
 

 
    return json; 
 
}

+0

На сегодняшний день я не думаю, что есть хороший ответ на эту проблему. На нем работает команда ember data. Этот снимок api выглядит многообещающим. https://github.com/emberjs/data/pull/2623. Спасибо за ответ, я вручу вам награду. –

Смежные вопросы