2012-05-01 16 views
1

私は現在Backboneアプリケーションを作成しており、backbone.localstorageプラグインを使用してデータを保持しています。私のアプリにはソート可能なアイテムがいくつかあるので、アイテムを並べ替えるたびにlocalStorageのデータオーダーも変更されることを願っています。次回にページ全体を更新すると、ページはソートされたデータによってレンダリングされます。しかし、backbone.localstorageはその作成順序でデータを保持しているようです。誰かが私にこれについてのいくつかのアイデアを与えることができますか?Backbone.jsアプリケーションでlocalStorageのデータの順序を変更するにはどうすればよいですか?

答えて

3

モデルを明示的に表示するには、comparatorをコレクションに入れ、可能であれば各モデルの位置番号を入れます。

Local storage is

文字列キー/値のペアが安全に格納され、後の使用のために取り出すことができるような手段。あなたが扱っていることを意味

キー/値ペアは、多かれ少なかれ、大きなハッシュテーブルと、それらは通常、順不同です。さらに、from the fine specification

キーの順序はユーザーエージェント定義ですが、キーの数が変更されない限り、オブジェクト内で一貫していなければなりません。 (したがって、キーを追加または削除すると、キーの順序が変更される可能性がありますが、既存のキーの値を変更するだけでは不可能です。)

ローカルストレージ内には特定の順序はありません。特定の注文が必要な場合は、自分で手配しなければなりません。

あなたのモデルでは、配列インデックスのように動作するpositionまたはindexプロパティがモデルに含まれている可能性があります。そして、あなたのコレクションに:あなたはあなたの周りのモデルを動かすと、位置インデックスを維持する必要があると思いますが、それはすべきではない

comparator: function(a, b) { 
    a = a.get('position'); 
    b = b.get('position'); 
    if(a < b) 
     return -1; 
    else if(a > b) 
     return 1; 
    return 0; 
} 

comparator: function(m) { return m.get('position') } // or 'index' 

また2つの引数comparator機能を使用することができますひどく難しい。データをローカルストレージから取り出してコレクションに入れてから、positionでデータを注文してから、ローカルストレージにモデルを書き込んでいるときにpositionの値を割り当てることもできます。

+0

したがって、モデルにインデックスを割り当て、コレクションにコンパレータを含めると、 'this.collection.fetch()'を使用してデータをロードしてビューをレンダリングするたびに、それは順序付けられた方法で表示されます自動的に、右か? – chaonextdoor

+0

@chaonextdoor:コンパレータを含めると、コレクション上で['add'](http://documentcloud.github.com/backbone/#Collection-add)を呼び出すたびに、そのコンパレータを使用してコレクションが順序付けられます'at'オプションを' add'に指定します)。これにより、手作業で並べ替えるのはややこしいことになるので、ローカルストレージから出て行く位置について心配したいだけかもしれません。 –

+0

'this.collection.add()'を呼び出すと、モデルは適切な場所に挿入されます。しかし、最初のページをレンダリングするために 'this.collection.fetch()'を最初から呼び出すと、ページ全体が順序どおりにならず、最初に手動でソートしてから最初のビューをレンダリングする必要があります。 – chaonextdoor

関連する問題