2012-04-17 91 views
8

此代碼沒有太多上下文,但會說明我的問題。這是一個在AMD模塊中定義的骨幹視圖,我用它來加載require.js初始化後添加backbone.js事件

本質上,我希望能夠在運行初始化後將事件添加到主幹視圖。目前我正在創建一個空的事件對象,然後在一個名爲addView的方法中,每次調用該函數時都會添加一個事件。這目前沒有工作。

我不確定事件是在什麼時間註冊的,但我懷疑我在某種程度上必須讓events對象更改時更新它的監聽器。

有誰知道我可以如何在初始化後將事件添加到Backbone.js?

define([ 
    'jQuery', 
    'Backbone'], 

    function ($, Backbone) { 

     var contentViews = new Array(); 

     var SlidePanelView = Backbone.View.extend({ 

      events: {}, 

      /// <param name="targetDataAtt">The unique value inside the target's Data-Slide-Panel-Id attribute</param> 
      /// <param name="event">Backbone event to trigger view</param> 
      /// <param name="destroyOnRemove">True to destroy view when removed, False otherwise (Default true)</param> 
      addView: function (targetDataAtt, event, view, destroyOnRemove) { 
       destroyOnRemove = typeof destroyOnRemove !== 'undefined' ? destroyOnRemove : true; 

       this.events[event] = "viewEventFired"; 
       contentViews[targetDataAtt] = { View: view, DestroyOnRemove: destroyOnRemove }; 
      }, 

      viewEventFired: function (e) { 

       var target = $(e.target); 
       var id = target.attr('data-slide-panel-id'); 
       console.log(id); 
      } 

     }); 

     // Return a singleton?? 
     return new SlidePanelView; 


    }); 

回答

11

如果我理解正確的問題,添加其他事件的事件哈希後,調用delegateEvents()在視圖上重新綁定事件。

addView: function (targetDataAtt, event, view, destroyOnRemove) { 
     destroyOnRemove = typeof destroyOnRemove !== 'undefined' ? destroyOnRemove : true; 
     this.events[event] = "viewEventFired"; 
     this.delegateEvents(); 
     contentViews[targetDataAtt] = { View: view, DestroyOnRemove: destroyOnRemove }; 
    } 

它並解除綁定所有現有的事件綁定並重新綁定事件中的所有事件再次亂碼,我不知道的這樣做的潛在的性能問題,但它的東西要注意的。