2011-09-17 5 views
1

私はBackbone.jsを使用して、ステータスが異なるアイテム(電子メール受信者)のリストをレンダリングしています。確認済み、保留中など。リストがレンダリングされた後、ユーザがそれらをフィルタリングするためのオプションがあり、ユーザは全ての受信者をリストすることができ、または確認された受信者のみをリストすることができる。項目(受信者)は、自然Backbone.js:すべてのビューをクリアする最も良い方法

私のアプローチは、フィルタイベントでの..ですコレクションに格納されています。

  1. すべてクリアアイテムのビューのアプリビュー呼び出しから
  2. コレクション内filterOnStatus機能すべてのモデルを返し、それらをビューに追加します。

手順2はうまくいきます。しかし、コレクションのビューのすべてのアイテムをクリアするにはどうすればよいでしょうか。

Todoのサンプルアプリケーション(http://documentcloud.github.com/backbone/examples/todos/index.html)では、同様の処理を行います。アプリケーションビューでは、次のコードを使用して、完了したすべてのアイテムをリストから消去します。

clearCompleted: function() { 
    _.each(Todos.done(), function(todo){ todo.destroy(); }); 
    return false; 
}, 

ここでの違いは、実際のモデルを削除することです。そのモデルのビューは、ビューを削除する破棄イベントをリッスンします。

モデルを保持したいです。

これを解決する最良の方法は何ですか。モデルの中でビューへの参照を保存し、モデルを反復してビューを削除する必要がありますか?

モデルの属性をフィルタリングしたい場合は、より良いアプローチがありますか?

答えて

0

すべてのアイテムをクリアするだけの場合は、ちょうどそのような簡単な方法、たとえばclearList: function() { this.$('.list').html('') }をAppViewに追加しないでください。

さらに、すべてのモデルをフィルタリングして一時的な要素にレンダリングし、現在のリストをその要素に置き換えることができます。したがって、すべてのフィルタリングは1回のDOM呼び出しでのみ実行されます(DOMは遅い)。 jQueryを使用した例:

AppView.filterOnStatus = function() { 
    var $fragment = $('<div/>') 

    // filter your collection and append rendered views to $fragment 

    this.$('.list').html($fragment.html()) 
} 

もちろん、もっと複雑な方法がありますが、必要とするかどうかは、達成しようとしているものによって異なります。私が理解したところから、この単純なアプローチは十分にうまくいくでしょう。

+1

しかし、このアプローチでは、私の見解のトラックが緩やかです(すべてのリスト項目はビューです)。いいえ? – Sebastian

+0

トラックを紛失してどういう意味ですか?なぜあなたはそれを保持したいですか? –

+0

私はビューオブジェクトを意味しました、メモリ的に。私はview.remove()を呼び出していません。その上に。しかし、DOMからDOM表現を削除すると、自動的にバックボーン・ビューが削除されるというあなたの意見はありますか? – Sebastian