2

ネストされたビュー間で通信するためにイベントを使用するか、メソッドを呼び出すために参照を保持することで、より効率的になります。次の例は、2つのビューを示しています。外側のビューはクリックイベントに応答し、イベントまたはメソッド呼び出しのいずれかを使用して、InnerViewに適切に応答させることができます。

InnerView = Backbone.View.extend({

    initialize: function() {
        this.model.bind('doSomethingEvent', this.doSomething);
    },

    doSomething: function() {
        // This could have been called from event/trigger
        // or from direction method invocation using reference.
    }
});


OuterView = Backbone.View.extend({

    events = {
        'click' : 'handleOutViewClick'
    },

    render: function() {

        // Create InnerView to render some model
        var innerView = new InnerView({model:this.model });

        $(this.el).append(innerView.render().el);

        // Could store a reference to the View?
        this.viewRef = innerView;
    },

    handleOutViewClick: function(e) {

        // Should this function use a reference to the InnerView instance:
        this.viewRef.doSomething();

        // Or should it trigger an event on this.model that 
        // the InnerView is bound to?
        this.someCollection.trigger('doSomethingEvent');
    }
});
4

1 に答える 1

4

おそらく、単一のメソッド呼び出しは、少なくとも2つのメソッド呼び出しを伴うイベントディスパッチよりも効率的です。しかし、ここで技術的にどちらがより「効率的」であるかについて心配する必要はないと思います。これが1秒間に何度も発生しない限り、よりクリーンでより正確なコードを作成するためにのみ気にすることができます。最もクリーンなパターンは、伝達される詳細に依存すると思います。これが私の好みです:

  1. モデルとコレクションを操作するのがouterviewに自然に適合し、innerviewが通常のバックボーンモデル/コレクションイベントを介して応答する場合、それが最もクリーンです。

  2. 何が起こっているのかが実際にはモデルに関するものではない場合は、「ビューモデル」パターンを検討してください。このパターンでは、モデルを相互作用させるつもりはありませんが、ビューの状態の興味深い部分をバックエンドモデルであるかのようにモデル化します。サーバーで。次に、2つのビューをビューモデルから発生するイベントにバインドし、共通の「ビューモデル」インスタンスを変更してそれらを調整します。これは、サーバーの基になるモデルに直接関連付けられていない相互依存状態が多数ある複雑なビューに使用するパターンです。

  3. 起こっていることがモデル/コレクションを実際に変更せず、ビュー固有のものである場合、直接メソッドディスパッチはより簡単ですが、より緊密に結合されます。イベントディスパッチによって提供される緩い結合が、余分な複雑さと追跡しにくい制御フローに値する場合を決定するのは、あなたの判断次第です。

于 2012-04-13T18:30:51.880 に答える