TL; DR:サーバーからモデルコレクション全体をポーリングしている場合、変更された属性を各モデルにマージし、追加/削除したモデルをコレクションに追加/削除する方法を教えてください?私の基幹アプリでサーバーの応答を伴うバックボーンコレクションをマージする
、私はモデルのコレクション全体をポーリングしています。
myCollection.reset(server_response);
これの唯一の問題は、それが古いモデルを取り除くことで、利益をなくすの種類:私は、私は基本的にはそう、私はモデルの配列を取得するたびにreset
を呼び出していますBackbone.Collection
を持っていますモデル上のイベント。これは当然のreset
の目的ですが、私は何をしたいコレクションをモデルの変更属性を変更し、対応していないモデルを削除し、それに応答していたモデルを追加するだけでなくです。
基本的に私は、データのマージの並べ替えをしたいです。すでに反応して、コレクションしているモデルの場合
、私は、プロセス内のchange
イベントをトリガ、私はちょうどmodel.set(attributes)
を行うことができますし、それが実際に変更ものだけをINGのset
の世話をすると信じています。これは素晴らしい。
しかし、どのように私はいない応答ではなく、コレクションでは、モデルはすでに対応してではなく、コレクションにあった場合、およびその逆を扱うのですか?
私の提案された解決策
バックボーンはすでにこれを行う方法を持っている場合、私は知らない、と私は私が求めている理由である過度に複雑することができるが、私はメソッドを作成するので、その後を考えていました私のコレクションにはserver_response
が渡されます。
id
の属性のすべてがserver_response
、およびコレクションの中のモデルのid
のすべての属性を取得します。
応答id
年代の差 - コレクションが=モデルを添加なり、そしてその逆モデルを除去することになります。それらのモデルをそれぞれコレクションに追加して削除します。
id
の両方のセットの共通部分が修正されたモデルになるので、id
を反復して、単にcollection.get(id).set(attributes)
を実行します。 pseudocoffeescriptで
:
merge: (server_response) =>
response_ids = _.pluck(server_response, 'id')
collection_ids = @pluck('id')
added = _.difference(response_ids, collection_ids)
for add in added
@add(_.find(server_response, (model) ->
return model.id == add
))
removed = _.difference(collection_ids, response_ids)
for remove in removed
@remove(@get(remove))
changed = _.intersection(response_ids, collection_ids)
for change in changed
@get(change).set(_.find(server_response, (model) ->
return model.id == change
))
*> pseudocoffeescriptで:*神ああ。 –
それは実際にcoffeescriptだ、私はまだhahaをテストしていないので、私は疑似を意味した。 –