EmberJS 2.7如何重组/重新格式化/自定义从商店返回的数据

时间:2016-08-30 11:01:54

标签: json ember.js data-structures ember-data ember-router

我认为这是一个非常简单的问题,但我不知道如何进行这种数据操作。 This遗憾地没有帮助,尽管这与我对Ember的痛苦一样。

这是一条路线:

路线/ 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');
},

但后来我需要对其进行重组......但是如何?

我必须以某种方式迭代类别集合并从每条记录中提取部分数据以替换数据' modelTestData对象的一部分。

所以我有3个问题我完全被难倒:

  1. 如何到达'我需要从模型中获取属性吗?
  2. 如何将它们组织成具有' y'的对象数组。和' name'?
  3. 如何将该结构分配给'数据' modelTestData的属性而不是硬编码?
  4. Categories是一个像这样的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"
             }
          }
       ]
    }
    

    我需要将克值映射到' y'和名称' name'在modelTestData。

    请注意,类别数据在其他路径中用于其他目的,与API返回的完全相同。所以我不想改变模型结构本身,或者API返回的内容......这将破坏使用“类别”的应用程序的其他部分。在其原始结构中。

    这是一个特定的用例,该路由需要按照modelTestData的结构来按摩数据以传递给子组件。

    我也想知道这个数据操作任务是否属于路由?

    我应该以某种方式在serliazer适配器中执行此操作,创建一个新结构,例如“categoryWeights'所以我可以这样做:

    model: function() {
        return this.store.get('categoryWeights');
    },
    

    修改

    我已经设法在路线中做到这一点,但它只是给了我一个对象数组。我需要一个包含2个属性和嵌入式对象数组的对象。

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

2 个答案:

答案 0 :(得分:1)

这可能应该进入计算属性:

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

序列化程序是错误的地方,因为它不是你需要在服务器和你的应用程序之间转换它,而是在你的应用程序和一个奇怪的组件之间。 实际上,最好的办法是重构组件。

答案 1 :(得分:0)

好的,我让这个在路线上工作。

data.frame("From"=df$From[c(TRUE, head(df$To, -1) != tail(df$From, -1))], 
           "To"=df$To[c(head(df$To, -1) != tail(df$From, -1), TRUE)])
  From To
1    a  d
2    e  f

我仍然觉得这应该在适配器或序列化器中完成。很高兴看到答案显示如何做到这一点。