У меня есть то, что я думаю, очень простая проблема, но я просто не понимаю, как это сделать. This, к сожалению, не помогло, хотя это та же боль, что и я с Эмбером.EmberJS 2.7 Как реструктурировать/переформатировать/настроить данные, возвращенные из магазина
Вот маршрут:
маршрут/dashboard.js:
import Ember from 'ember';
export default Ember.Route.extend({
// this is for testing, normally we get the data from the store
model: function() {
return this.get('modelTestData');
},
modelTestData: [{
name: 'gear',
colorByPoint: true,
data: [
{y: 10, name: 'Test1'},
{y: 12, name: 'Test2'},
{y: 40, name: 'Test3'}
]
}],
});
Структура объект «modelTestData» должен быть точно так, как он передается в дочерний компонент, который нуждается он структурирован таким образом.
я легко могу получить мои данные из API и поместить его в модель:
model: function() {
return this.store.get('category');
},
Но тогда мне нужно перестроить его ... но как?
Я должен как-то перебирать коллекции категорий и извлекать части данных из каждой записи, чтобы заменить часть данных «dataTestData».
Так у меня есть 3 проблемы, я полностью тупик на:
- Как «попасть на» атрибуты, которые мне нужно от модели?
- Как структурировать их как массив объектов с помощью «y» и «name»?
- Как назначить эту структуру свойству data for modelTestData вместо того, чтобы быть жестко запрограммированным?
Категории является объектом JSONAPI так:
{
"data":[
{
"id":"1",
"type":"categories",
"attributes":{
"name":"Carrying system",
"total-grams":"0.0"
}
},
{
"id":"2",
"type":"categories",
"attributes":{
"name":"Shelter system",
"total-grams":"0.0"
}
}
]
}
Мне нужно отобразить значение в граммах на «у» и имя на «имя» в modelTestData.
Обратите внимание, что данные категории используются в других маршрутах для других целей, в точности возвращаемых API. Поэтому я не хочу изменять структуру модели, или то, что API возвращает ..., что сломает другие части приложения, которые используют «категорию» в своей исходной структуре.
Это конкретный вариант использования этого маршрута, который должен массировать данные для перехода к дочернему компоненту в соответствии с структурой modelTestData.
Я также задаюсь вопросом, принадлежит ли эта задача обработки данных в маршруте?
Должен ли я каким-то образом сделать это в адаптере serliazer, создавая новую структуру, как говорят, чтобы я мог тогда сделать «categoryWeights»:
model: function() {
return this.store.get('categoryWeights');
},
EDIT
мне удалось это сделать в маршруте, но он просто дает мне массив объектов. Мне нужен один объект, содержащий 2 свойства и встроенный массив объектов.
model() {
return this.store.findAll('category')
.then(categories => categories.map(category => {
let data = {
y: category.get('totalGrams'),
name: category.get('name')
};
return data;
}))
},
Я не могу реорганизовать компонент, так как это сторонний компонент. Но да, вы правы, это между приложением и компонентом, поэтому, похоже, это правильный способ сделать это. Также гораздо легче понять, что делает этот код, чем мое собственное решение! – rmcsharry