2011-12-30 89 views
0

因此,我已經開始使用Backbone.js來構建我的JavaScript代碼並使用模塊化應用程序,並且遇到了一個註冊事件的問題。BackboneJS:從表單提交視圖的觸發器表單驗證

我想做一個簡單的視圖來處理表單並驗證它們。在未來,我想補充的所有JavaScript functionallity如實時驗證,懸停效果等

這是簡化的代碼,我現在所擁有的:

var Form = Backbone.View.extend({ 
    attributes: { 
     att1 = 'att1', 
     att2 = 'att2' 
    }, 
    events: { 
     'submit': 'validateFields' 
    }, 
    initialize: function(element) { 
     this.el = $(element); 
    }, 
    validateFields: function() { 
     alert(this.attributes.att1); //do something 
     return false; 
    } 
}); 

var f = new Form('#formid'); 

我的問題是,validateFields我提交表單時不會調用函數。我在構造函數中使用,這也試過:

this.el.bind('submit', this.validateFields); 

現在,最後一個代碼的作品,但「這種」內部的驗證功能將是$(「#formid」)的對象,而不是我的窗體對象。

回答

0

嘗試以其他方式設置你的el

var f = new Form({el: '#formid'}); 

在這種情況下,你甚至可以刪除初始化方法(或修改):

var Form = Backbone.View.extend({ 
    // ... 
    initialize: function() { 
     // Some code 
    }, 
    // ... 
}); 

至於這段代碼而言:this.el.bind('submit', this.validateFields); 。如果您想保留表單對象上下文,你應該使用綁定:

this.el.bind('submit', _.bind(this.validateFields, this)); // using Underscore method 
this.el.bind('submit', $.proxy(this.validateFields, this)); // using jQuery method 
+0

感謝您的回答,正如保羅所說的事件是使用委託()jQuery函數調用,但問題不是那樣,問題是在初始化方法之前調用它。按照你所說的初始化對象是完美的。 – 2011-12-31 09:44:24

3

骨幹網使用jQuery的delegate方法將事件的回調綁定在events哈希值。

不幸的是,delegate方法不能在IE See comment in Backbone source

用於提交事件的工作一個簡單的辦法就是這行代碼添加到您的render方法。

render: function() { 
    //render the view 
    $(this.el).submit(this.validateFields); 
} 

您還需要上下文綁定的validateFields在初始化方法

initialize: function() { 
    _.bindAll(this, 'render', 'validateFields'); 
}