2013-03-28 152 views
15

我使用下面的代碼來創建視圖:如何獲得骨幹將提交事件綁定到表單?

LoginForm = Backbone.View.extend({ 

    tagName :"form" 
    ,id : "login-form" 
    ,className :"navbar-form" 
    ,initialize: function() { 
      this.model = new StackMob.User(); 
      this.render(); 
    } 
    ,render: function() { 
      $(this.el).html(this.template()); 
      return this; 
    } 
    ,events : { 
      "change" : "change" 
      ,"submit #login-form" : "login" 
    } 
    ,login : function(event) { 
      event.preventDefault(); 
      var self = this; 
      this.model.login(true, { 
        success: function(model) { 
          app.alertSuccess("User logged in"); 
          self.render(); 
        } 
        ,error: function(model, response) { 
          app.alertError("Could not login user: " + response.error_description); 
        } 
      }); 
      event.currentTarget.checkValidity(); 
      return false; 
    } 
// rest of code 

而且模板:

<input name="username" class="span2" type="email" placeholder="Email" required > 
<input name="password" class="span2" type="password" placeholder="Password" required > 
<button id="login-button" type="submit" class="btn">Sign in</button> 

當我綁定按鈕,登錄函數被調用。綁定表單提交事件時,登錄函數不會被調用。如果表單標籤是模板的一部分,我也可以獲取表單綁定,這不是我想要在這裏完成的。

如何在這種情況下綁定表單提交?

回答

35
"submit #login-form" : "login" 

我認爲Backbone只會在後代中搜索這個id。所以它永遠不會匹配你自己的視圖元素。你爲什麼不使用:

"submit": "login" 

正如你所做的改變。
只能確定Backbone的代碼。

編輯:
如果你把一個選擇,骨幹會調用

this.$el.on(event, selector, method); 

代替

this.$el.on(event, method); 

而上的jQuery的方法,而不是選擇適用於後裔僅包含元素的,不包含元素本身。

+2

相關文檔隱藏在['delegateEvents'](http:// backbonejs。org /#View-delegateEvents)documentation:「省略'selector'會導致事件綁定到視圖的根元素'(this.el)'。」 –

+0

不幸的是,這並不排除他在做什麼。那麼,我想這仍然是足夠的信息。 – Loamhoof

+0

提交沒有選擇工作! –

3

您正在使用Backbone錯誤。所以,你會怎樣想幹什麼,

template: my_template_string, 
render: function() { 
    this.el.innerHTML = this.template(); 
}, 
events: { 
    "submit #login-form": function (event) {} 
} 

this.template設置爲

<form id="login-form" class="navbar-form"> 
    <input name="username" class="span2" type="email" placeholder="Email" required > 
    <input name="password" class="span2" type="password" placeholder="Password" required > 
    <button id="login-button" type="submit" class="btn">Sign in</button> 
</form> 

而且不認爲只有有意義嗎?你爲什麼要將id和classname與輸入元素分開?順便說一句,你仍然可以做submit肉眼包羅萬象,但只是在我的方法,

  • <form>類,並<form>屬性綁定到窗體的模板,而不是僅僅骨幹視圖,
  • 將你明確地捕獲了正確的提交,
  • 你可以永遠支持多個提交事件(如果一個模板有兩個表單)。
+0

你說的是「殭屍意見」問題? id/tagName與問題無關。 – suish

+0

@suish是的,我同意我不使用標記名的原因,並且className,id稍有不同。我在頁面上爲他們服務,不讓Backbone創建它們。我已經刪除了我的咆哮,並留下了答案的其他更多適用部分。我仍然建議不要使用該功能。 ;) –

0

也許當你綁定表單提交事件時,它只是提交表單會觸發'submit'事件。你可以添加下面的代碼並再次嘗試。

$('#id').submit(function(ev) { 

});