2013-08-30 59 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(),并且不要忘记在不再需要时处理它们。