2013-08-30 61 views
3

我正在開發一個使用骨幹網的應用程序。在我的骨幹視圖中,我正在使用事件表單提交。第一次加載視圖時,表單提交就可以了。但是,當我切換路由器,然後我提交我的表單它發送多個相同的Ajax請求。多個相同的Ajax請求觸發表單提交骨幹?

我的觀點是繼..

var View_AdvanceSearchArea = Backbone.View.extend({ 
    el: '.page', 
    events: { 
     'change #genderID': 'genderChange', 
     'change #areaID': 'areaChage', 
     'submit #advanceSearchForm': 'formSubmit' 
    }, 
    genderChange: function() { 
     $.ajax({ 
      url: 'getBodyHeightByGender', 
      type: 'POST', 
      data: '&genderID=' + $('#genderID').val(), 
      success: function(res) { 
       $('#bodyHeightID').html(res); 
      } 
     }); 
     $.ajax({ 
      url: 'getAgeByGender', 
      type: 'POST', 
      data: '&genderID=' + $('#genderID').val(), 
      success: function(res) { 
       $('#seventhDigitID').html(res); 
      } 
     }); 
    }, 
    areaChage: function() { 
     $.ajax({ 
      url: 'getSubAreaByArea', 
      type: 'POST', 
      data: '&areaID=' + $('#areaID').val(), 
      success: function(res) { 
       $('#subAreaID').html(res); 
      } 
     }); 
    }, 
    formSubmit: function(e) { 
     e.preventDefault(); 
     var formData = $('#advanceSearchForm').serializeArray(); 
     var vAdvanceSearchResult = new View_AdvanceSearchResult(); 
     vAdvanceSearchResult.render(formData); 
    }, 
    render: function() { 
     var $this = this; 
     var mAdvanceSearchForm = new Model_AdvanceSearchForm(); 
     mAdvanceSearchForm.fetch({ 
      success: function(res) { 
       var template = _.template($('#advance_search_area').html(), {res: res.attributes}); 
       $this.$el.html(template); 
      } 
     }); 
    } 
}); 

問題是什麼? 任何幫助?

回答

2

當您調用視圖時,它的事件每次都綁定到DOM元素。 你必須undelegate從視圖時初始化的DOM元素的事件..

試着在你看來下面的代碼..

var View_AdvanceSearchArea = Backbone.View.extend({ 
    el: '.page', 
    initialize: function() { 
     $(this.el).undelegate('#advanceSearchForm', 'submit'); 
     $(this.el).undelegate('#genderID', 'change'); 
     $(this.el).undelegate('#areaID', 'change'); 
    }, 
    //here is your rest of code 

希望它爲你..

+0

謝謝,最後它的作品 –

+0

非常歡迎 – 2014-01-08 07:12:47

0
  1. Model_AdvanceSearchForm()在render()方法中創建,當您在路由器中調用render()時可能導致內存泄漏。它也可能是一個意外行爲的原因,因爲HTML元素從視圖中分離出來,但仍然存在於內存中,因此如果它們綁定到模型上,就會以某種方式參與偶數代。
  2. 也在form中提交您創建View_AdvanceSearchResult,這也可能導致內存泄漏或意外的行爲。

要了解更多信息,請查看this postBackbone.js CookBook

解決方法是在initialize()方法中創建只需要一次的新對象,而不是render()或formSubmit(),並且不要忘記在不再需要時處理它們。