2012-02-04 14 views
0

バックボーンビューの管理に最適な方法を見つけるのに役立ちます。バックボーンモデルビューの表示/非表示のアプローチ

たとえば、コレクションの各モデルのビューMyModelViewで構成されるMyCollectionViewのコレクションがあります。

ページ上の一部のモデルを非表示にするにはどうすればよいですか?

今、私はこの方法を、次の午前:いくつかは、私はモデルのプロパティを確認し、model.trigger 'hide'かを呼び出し、この関数では

  • paramsはと私はモデル関数filterを呼び出すループの内側すべてのmodel
  • ため

    • 使用collection.eachmodel.trigger 'show'
    • 最後に、model viewにはthis.model.bind 'hide', this.hide, thisを使用しますが、実際には.hide()またはを使用しています

    このように私はひどいと思われます...なぜこの長い関数やイベントの連鎖をする必要がありますか?最も簡単なアプローチはありますか?

    ありがとうございます!これらは、データを表現することになっていると、アプリケーションの制御に参加するべきではありません - -

  • 答えて

    2

    あなたのモデルは、彼らが何をすべきか意見を言っていないしてはならないので、何の不思議を、それはあなたに間違って感じている:)

    よりMyCollectionViewにフィルタメソッドを追加すると、アンダースコアメソッドを使用して、表示/非表示にするビューをフィルタリングし、その作業を行います。その際、どのモデルを表示するかを選択します。次に、マッチの配列を持つだけで、リストをレンダリングするためのメソッドを呼び出し、モデルの配列を渡して、一致するモデルのビューをレンダリングすることができます。

    このようなフィルタを作成した経験から、長いリストでは全体のリストを削除するほうがずっと効率的であると言えます。コレクションレベルでフィルタリングを行い、フィルタクエリと一致するビューのみを再度レンダリングします。 jQueryのhide/showは少し税金がかかるかもしれませんが、大量のデータ/ビューしか持たないことが懸念されます。

    また、コレクションにバインドされたアンダースコアメソッドを利用してください - あなたはちょうど

    var matches = collection.filter(function(model) { 
        return /*matching condition*/; 
    }); 
    

    は(また、リストをレンダリングし、ビューのDOM事前に生成されたリストに追加する際のDocumentFragmentを使用することを覚えていないことができcollection.each(...をする必要はありません1つ1つ追加するのではなく)

    +0

    お返事ありがとうございます。私はいくつかの追加の質問があります..なぜすべての論理は視野の中にあるべきですか?私はフィルタリングのための多くの声明があります。それらのすべてをモデル化することはできますか?また、ビューフィルタの内部動作は 'return model.filter(conditions)'のみを使用します。その後、レンダリング機能を呼び出す必要があります。 新しいビューのレンダリングは興味のあるアプローチです:) – ValeriiVasin

    +0

    フィルタリングメソッドをコレクションクラス定義に移動することも意味があります。しかし、それはデータのサブセットを取得するヘルパーです。モデルやコレクションはデータを保存することになっていますが、データなどの妥当性を認識している必要がありますが、アプリケーションの流れを制御する構造体の役割を果たすので、変更や変更はしないでください。 。 –

    +0

    フィルタリングをビューメソッドとして使うのではなく、コレクションではなく、私があなたに気づかずにレンダリングリストを扱っていた特別なListViewクラス(私がそこで述べたdocumentFragmentを使って)を使用したときに、アイテムビューまたはコレクションのタイプと構造 - オプションとして、アイテムビューファクトリメソッド、フィルタリング条件を渡すことができました。ビューは、ユーザーが設定したフィルタに基づいて表示する必要があるものを決定し、適切なモデルを選択しましたコレクションからビューを作成してレンダリングする –