私は、ルータに対応するすべてのビューのスーパークラスを作成した。(私は、他のビューを持っていますサブビュー、またはウィジェット)を表示します。このスーパークラスには、ビューを非表示にするために必要なすべてのスマートがあります。すべてのビューのコンテナをタブで飾ることができます。すべてのルーテッド・ビューはそのクラスから継承します。ルーテッドビューとルーターの両方は共通プールからIDについて「学習」し、アンダースコアのtemplate
機能を使用してオンザフライで構築されるため、情報はDRYを維持したまま単一の場所に保存されます。
コレクション(「果物」または「野菜」についてのビュー)は永続タブであり、一部のタブ(コレクション内の個々のアイテムに関するビュー、「バナナ」または「キュウリ」)は一時的です。ルータには#/:type
と#/:type/:id
を区別するためのメソッド呼び出しがあり、後者は必要に応じて作成されます。ルータ内の変数は、ビューが既に生成されているのを追跡し、そしてそれらは、ユーザーがために求められていない場合のビューを構築しないことによってメモリを保存し、構築する必要がある例:
Controller.prototype.item = function(type, id) {
var v, view;
view = ((v = this.views)[type + '.' + id]) || (v[type + '.' + id] = (
new ItemView({model: this.collections.getByCid(type).getByCid(id)})).render());
view.show();
}
。なお、このイディオム(Coffeescriptからレンダリングされています)では、あなたのrender
メソッドreturn this;
が重要です。これにより、新しいビューが表示される前にレンダリングされます。既存のビューはおそらく既にレンダリングされており、再レンダリングは必要ありません。エレガントなフェード/スライド/その他のものがあります。
特にピクセル完全になり、render()はjQuery.deferred
オブジェクトを返します。 .then(view.show)
に電話をかけて、レンダリングが完了してから表示されることを確認してください。
私はこの考えが好きです。あなたが共有できるスーパークラスの実装がありますか? – Simon
悲しいことに、私は公に共有することはできません。しかし、ここでは1つのメソッド 'show()'の基本があります:可視なら何もしません。タブに「アクティブ」クラスを追加します。その事をフェードインするために遅延されたjQueryを作成します。サブクラスに必要な設定を行うように通知するために、ビューに "show"をトリガーします。繰り延べる。使用するために、ルータはビューの配列内のすべてのビューでhideを呼び出します。すでに隠れたビューは 'true'を返し、ビューはフェードアウトして戻ります。 '$ .when(this.hideAll())のようなもの。then(view.show())' –
エルフに感謝します! – Simon