2016-08-30 4 views
1

У меня есть то, что я думаю, очень простая проблема, но я просто не понимаю, как это сделать. 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 проблемы, я полностью тупик на:

  1. Как «попасть на» атрибуты, которые мне нужно от модели?
  2. Как структурировать их как массив объектов с помощью «y» и «name»?
  3. Как назначить эту структуру свойству 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; 
     })) 
    },  

ответ

1

Это, вероятно, следует перейти в вычисленную собственность:

dataForSubModel: Ember.computed('[email protected]', '[email protected]', { 
    get() { 
    return [{name: 'gear', colorByPoint: true, this.get('model').map(m => ({y:m.get('totalGrams'), name:m.get('name')}))} 
    } 
}), 

сериализатором является неправильным местом, потому что его не то, что вам нужно, чтобы преобразовать его между сервером и вашим приложением, но между вашим приложением и а странный компонент. На самом деле лучше всего будет реорганизовать компонент.

+0

Я не могу реорганизовать компонент, так как это сторонний компонент. Но да, вы правы, это между приложением и компонентом, поэтому, похоже, это правильный способ сделать это. Также гораздо легче понять, что делает этот код, чем мое собственное решение! – rmcsharry

0

Хорошо, я получил это, чтобы работать на маршруте.

model() { 
return this.store.findAll('category') 
    .then(function(categories) { 
     let data = []; 
     data = categories.map(category => { 
      return { 
       y: category.get('totalGrams'), 
       name: category.get('name') 
       } 
      }); 
     return [{name: 'gear', colorByPoint: true, data}]; 
    }) 
}, 

Я до сих пор ощущение, что это должно быть сделано в адаптере или сериализатором. Будем рады видеть ответы, которые показывают, как это сделать.

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