簡體   English   中英

骨干視圖點擊事件未觸發

[英]Backbone view click event not firing

這是代碼:

var view = Backbone.View.extend({
  el:'#comment',
  template:'',
  initialize:function(){
    this._getTemplate();
    this.render();
  },
  event:{
    'click #submit_btn' : 'submit'
  },
  _getTemplate:function(){
    $.ajax({
      ...
    });
  },
  render:function(){
    this.$el.html(this.template);
  },
  submit:function(event){
    alert('click');
  }
});

我使用ajax從服務器獲取html模板,並且效果很好。 我加載模板沒有問題。

這是我要插入模板的div。

<div id="comment">...</div>

這是模板。 我只是顯示簡單的結構。

<div>...</div>
<button id="submit_btn">submit</button>
<div>...</div>

有人可以幫我解決嗎?

看來事件字符串設置正確,並且render函數做正確的事。 我看到的一個問題是,根據Backbone View Extend文檔,應該對“初始化”功能進行“初始化”。

參考: http : //backbonejs.org/#View-extend

事件未觸發,因為當嘗試將事件綁定到DOM元素時(即,在構造View時),DOM元素不存在。 骨干文檔

在調用初始化之前,Backbone會在實例化時自動附加事件偵聽器。

由於#submit_btn DOM元素匹配器不返回任何內容,因此不會綁定任何事件。

您在initialize()方法中獲取模板的技術會出現問題。 在大多數基於OO的開發模式中,對象的構造函數不應執行大量工作,並且當構造函數完成時,應完全初始化返回的實例。 骨干網視圖在這方面沒有什么不同。 此處編寫的構造方法會嘗試做很多工作,但是將模板作為對象創建的一部分來獲取並沒有任何好處。 實際上也有一些危害:如果最終創建多個View實例怎么辦? 即使內容完全相同,您最終還是要多次獲取模板。

強制任何一種XHR同步也是有問題的。 在同步請求期間,瀏覽器的主線程正忙於等待響應。 在此示例中,如果模板花費的時間超過幾百毫秒,則您的應用程序將對用戶顯示為“凍結”。 這提供了非常差的用戶體驗。 異步代碼可能會讓您覺得更復雜,但是如果您要構建一個基於JS的應用程序,則該應用程序的復雜度甚至會降至最低。 由於Javascript(主要是單線程),因此異步執行成為任何應用程序必不可少的工具。

更好的解決方案是將模板嵌入到托管HTML頁面內容中, 或者使用JS模塊化技術(RequireJS,CommonJS等)將模板與需要模板的模塊有效地打包在一起。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM