2016-08-30 1 views
1

私は非常に単純な問題だと思っていますが、このデータ操作の仕方はわかりません。 This私はEmberと同じ痛みを感じていますが、悲しいことに助けになりませんでした。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'); 
}, 

しかし、私はそれを再構築する必要があります...しかし、どのように?

私は何とかカテゴリコレクションを繰り返し、各レコードからmodelTestDataオブジェクトの 'data'部分を置き換えるためにデータの一部を抽出する必要があります。

だから、私は完全に困惑しています3つの問題があります。モデルから、私は必要な属性「で取得」する方法

  1. を?
  2. 'y'と 'name'を使用してそれらをオブジェクトの配列として構造化する方法はありますか?
  3. ハードコードされているのではなく、その構造をmodelTestDataの 'data'プロパティに割り当てる方法はありますか?

カテゴリーこのような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で「名前」に「Y」と名のグラム値をマッピングする必要があります。

カテゴリデータは、APIによって返されたとおりに他の目的で他のルートで使用されます。だから私は、モデル構造自体やAPIが返すものを変更したくない...それは元の構造で 'カテゴリ'を使うアプリケーションの他の部分を壊すだろう。

これは、modelTestDataの構造に従って、このルートが子コンポーネントに渡すデータをマッサージする必要がある特定の使用例です。

このデータ操作タスクがルートに属しているかどうかも疑問です。私はこれを行うために管理している

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

EDIT:

は私が何とか「categoryWeights」はので、私はそれから行うことができると言うように、新しい構造を作成し、serliazerアダプタでこれを行う必要がありますしかし、それは私にオブジェクトの配列を与えるだけです。私は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')}))} 
    } 
}), 

シリアライザは、そのは、サーバーとあなたのアプリ間でそれを変換する必要がないことから、間違った場所ですが、あなたのアプリとA奇妙な要素。 実際には、コンポーネントをリファクタリングすることが最善の方法です。

+0

コンポーネントをリファクタリングすることはできません。第三者コンポーネントであるためです。しかし、はい、あなたは正しいです、それはアプリケーションとコンポーネントの間にあるので、これは正しい方法であるようです。このコードが自分の解決策よりもはるかに理解しやすい – rmcsharry

0

[OK]私はこのルートで動作するようになった。

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}]; 
    }) 
}, 

これは、アダプタまたはシリアライザで実行する必要があります。それを行う方法を示す回答を見てうれしいです。

関連する問題