私はbackbone.js'app'を作成しており、グラファイト/カーボンのjson出力をいくつかのバックボーンモデル/コレクションに直接マッピングしたいと思います。
一般に、jsonの出力は次のようになります。
[
{
'target': 'some.string.1',
'datapoints': [ [ val1, timestamp1 ], [ val2, timestamp2 ]... ]
},
{
'target': 'some.string.2',
'datapoints': [ [ val1, timestamp1 ], [ val2, timestamp2 ]... ]
},
...
]
私は次のような単純なモデルとコレクションを定義しました:
class Measurement extends Backbone.Model
defaults:
id: undefined
val: undefined
class Measurements extends Backbone.Collection
model: Measurement
initialize: (model, options) ->
if options.metric
@metric = options.metric
url: ->
'/?target=' + @metric
parse: (data,xhr) ->
if _.size(data) == 1
return _(data[0]['datapoints']).map( (d) ->
m = {}
m['id'] = new Date(0)
m['id'].setUTCSeconds( d[1] )
m['val'] = d[0]
m
)
undefined
ご覧のとおり、IDをオーバーロードして各測定のタイムスタンプにし、特定の「メトリック」のすべての測定値をMeasurementsというコレクションに保存します。
また、ハードコーディングしたので、実際には1つのMeasurementsコレクション(つまり、jsonの「ターゲット」)でのみ機能します。
私の質問は、1回の呼び出しで複数の測定値の収集(コレクション)を実装するのに最適/エレガント/柔軟性があるかどうかに関するものです。つまり、graphiteは「ターゲット」にワイルドカードを使用することをサポートしているため、ajaxリクエスト/?target=some.string.*
は一致するすべてのターゲットとデータポイントを返します(jsonの例のように)。次に、これをビューに表示し、累積データをレンダリングするか、すべての測定値を時間に対してプロットします。
多くの測定値を含む別のコレクション(セットと呼びましょう)を使用することを考えていました。Set.fetch()
サーバーから一致するすべての測定値を取得し、1つのajaxリクエストからセットに多くの測定値コレクションを作成させるようなことをしたいと思います。
誰かがこれを実装する方法の提案がありますか?または、このモデル/コレクションレイヤーを表すより良い方法はありますか?