3

Backbone を数か月使用してきましたが、表示されているビューとモデルを共有している場合、非表示のビューを処理するためのより良い方法が必要であると考えています。たとえば、「セグメントの表示」ビューと「セグメントの編集」ビューはどちらも「セグメント」モデルを表しています。これらの 1 つは常に非表示になっていますが、他のイベントと同じイベント (ajax 呼び出しを含む) をリッスンしています。ビューを置き換えるのではなく単に非表示にする理由は、ビューが大量のデータと DOM 要素を表示するため、ビューを変更する間のロード時間を最小限に抑えたいからです。非表示のビューは、表示されるまでレンダリングする必要はないと考えています。

このシナリオを処理する適切な (ベスト プラクティス) 方法はありますか? この問題をどのように処理しますか? ビュー全体のイベント リスニングを一時的に無効にする簡単な方法はありますか?

4

3 に答える 3

6

表示ビューと編集ビューでまったく同じシナリオを使用します。すべてのモデル バインディング ロジックをメソッドにまとめ、bindEventsそれをメソッドで補完しましたunbindEvents

hideビューの- メソッドで を呼び出しunbindEventsshowメソッドで を呼び出しますbindEvents。そのような単純な。また、ゾンビ ビューを回避するために、メソッド内およびメソッドbindEvents内で呼び出します。initializeunbindEventsremove

通常、非表示のビューでは発生しないため、javascript イベントは気にしません (ほとんどのイベントはクリックまたは変更によるものです)。

ところで、決して表示されない html の束をレンダリングすることを避けるために、最初に表示されるまでビューの最初のレンダリングを延期しますshowthis.isRendered、表示する前にビューをレンダリングし、true に設定します。

于 2012-08-01T19:55:44.477 に答える
3

モデルの変更時にレンダリングすると、ビューは常にモデルの変更イベントをリッスンします。私はあなたにも同じことを想定しているので、モデルがフェッチされたとき(つまり、ajax呼び出し)、何もしたくありません。レンダリング(およびモデル変更のリスニングメソッド)で、表示されているかどうかを検証できます。

render : function(){
  if( !this.$el.is(":visible") ){
    //skipping any render action because our view is hidden
    return this;
  }
}

また、ビューのメイン要素が表示されている場合にのみ機能するようにイベントを宣言します。子セレクターの前にプレフィックス:visibleを追加するだけです。

"click :visible .button" : "buttonClickHandler"
于 2012-07-31T04:58:49.320 に答える
1

簡単なアイデア:EditSegmentを表示する場合は、delegateEvents Backbone.Viewt提供、およびundelegateEventsメソッドを使用して、イベントを動的に設定できます。最初にundelegateEvents動的キャンセルViewSegment of Eventsを使用し、次に、delegateEvents動的初期化EditSegmenttheEventsを使用します。

編集-20120801:model.unbindについて

    bindTo: function(model, ev, callback) {
        model.bind(ev, callback, this);
        this.bindings.push({
            model: model,
            ev: ev,
            callback: callback
        });
    },

    _unbindFromAll: function() {
        _.each(this.bindings, function(binding) {
            binding.model.unbind(binding.ev, binding.callback);
        });
        this.bindings = [];
    },
于 2012-07-31T02:39:04.637 に答える