2012-08-22 320 views
2

在我的路由器我需要這樣一個觀點:骨幹RequireJS和delegateEvents

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' 
}, 

現在的問題是,如果視圖在第一次被回調被調用時呈現。但是如果視圖需要在其他地方再次渲染,則會調用兩次回調等等。

我該如何防止這種情況或我做錯了什麼?

UPDATE:

在此期間我已經改變了代碼在我的路由器:

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(); 
} 

這似乎解決了這個問題,但我仍然對新的骨幹這一知道這是否是一種有效的模式。

+0

你究竟用「被調用兩次」是什麼意思。 「正常」渲染不會調用回調。請分享完整的代碼。 – schacki

回答

0

在您看來,您可能會清除頁面上現有的HTML並將其替換爲新的HTML。當你清除舊的HTML時,你還應該清除舊的事件處理程序,以便它們不在周圍。例如,在你的視圖中,當你想渲染你的newHtml時,你可以這樣做:

@$el.off().html(newHtml) 
+0

對不起,但這似乎解除了事件的根本,沒有回調被調用了 – bardu