2

私のルーターでは、次のようなビューが必要です。

require(['views/business-detail-view'],
    function(BusinessDetailView) {
        var businessDetailView = new BusinessDetailView({collection:                        businessOverviewCollection.models[id], id: id});
        businessDetailView.render();
    }
);

ビューでは、次のようなイベントをバインドしています。

events: {
        'click #about-btn'   : 'aboutHandler',
        'click #contact-btn' : 'contactHandler',
        'click #deals-btn'   : 'dealsHandler',
        'click #map-btn'     : 'mapHandler'
},

ここでの問題は、ビューが最初にレンダリングされる場合、コールバックが呼び出されることです。しかし、別の場所でビューを再度レンダリングする必要がある場合は、コールバックが 2 回呼び出されます。

どうすればこれを防ぐことができますか、それとも何か間違っていますか?

アップデート:

それまでの間、ルーターのコードを次のように変更しました。

if ( !businessDetailView ) {
    require(['views/business-detail-view'],
        function(BusinessDetailView) {
            businessDetailView = new BusinessDetailView({collection: businessOverviewCollection.models[id]});
            businessDetailView.render(); 
        }
    );
}
else {
    businessDetailView.collection = businessOverviewCollection.models[id];
    businessDetailView.render(); 
}

問題を解決しているように見えますが、これが有効なパターンであるかどうかを知っているバックボーンにはまだ慣れていません。

4

1 に答える 1

0

ビューのある時点で、おそらくページ上の既存の HTML を消去し、新しい HTML に置き換えます。古い HTML を消去するときは、古いイベント ハンドラーも消去して、それらが配置されないようにする必要があります。たとえば、ビューで newHtml をレンダリングする場合は、次のようにします。

@$el.off().html(newHtml)
于 2012-08-22T21:41:35.727 に答える