2013-07-13 56 views
1

現在解決 - 請參閱底部....爲什麼我的jQuery隱藏事件不能觸發,我的Backbone子視圖不能渲染?

我有一個骨幹列表視圖與它應該顯示編輯元素的按鈕。

'showAddEntry'函數中的jQuery hide()調用或'versionEditView'的視圖渲染都沒有做任何事情。我已經步入正軌,沒有發生任何錯誤。我甚至嘗試過在控制檯上手動運行方法來查看隱藏的情況,但我沒有找到任何地方。

這裏的主視圖...

define(['ministry', 'jquery', 'models/m-version-info', 'views/about/v-edit-version-info-entry', 'text!templates/version-info/version-info.html'], 
function(Ministry, $, VersionInfo, VersionInfoEditView, TemplateSource) { 
    var versionInfoEntriesView = Ministry.View.extend({ 

     el: '#mainAppArea', 

     template: Handlebars.compile(TemplateSource), 

     versionInfoEditView: null, 

     initialize: function() { 
      this.$addEntryArea = $('#addVersionInfoEntryArea'); 
      this.$addEntryButton = $('#addVersionInfoEntryButton'); 
     }, 

     events: { 
      'click #addVersionInfoEntryButton': 'showAddEntry' 
     }, 

     render: function() { 
      var that = this; 
      var entries = new VersionInfo.Collection(); 

      entries.fetch({ 
       success: function (data) { 
        that.$el.html(that.template({ items: data.toJSON() })); 
       } 
      }); 

      return this; 
     }, 

     showAddEntry: function() { 
      if (this.versionInfoEditView != null) { 
       this.versionInfoEditView.trash(); 
      } 

      this.versionInfoEditView = new VersionInfoEditView({ el: this.$addEntryArea }); 
      this.$addEntryButton.hide(); 
      this.versionInfoEditView.render(); 
      return false; 
     } 
    }); 

    return versionInfoEntriesView; 
}); 

而這裏的子視圖...

define(['ministry', 'models/m-version-info', 'text!templates/version-info/edit-version-info- entry.html', 'jquery.custom'], 
function (Ministry, VersionInfo, TemplateSource) { 

    var editVersionInfoView = Ministry.View.extend({ 

     template: Handlebars.compile(TemplateSource), 

     initialize: function() { 
      this.$dbVersionInput = this.$('#dbVersion'); 
      this.$tagInput = this.$('#tag'); 
     }, 

     render: function() { 
      this.$el.html(this.template()); 
      return this; 
     }, 

     events: { 
      'submit .edit-version-info-form': 'saveEntry' 
     }, 

     saveEntry: function() { 
      var entry = new VersionInfo.Model({ dbVersion: this.$dbVersionInput.val(), tag: this.$tagInput.val() }); 
      entry.save({ 
       success: function() { 
        alert('Your item has been saved'); 
       } 
      }); 
      return false; 
     } 
    }); 

    return editVersionInfoView; 
}); 

和主模板......

<h2>Version Info</h2> 
<div id="info"> 
    <a id="addVersionInfoEntryButton" href="#/versioninfo">Add manual entry</a> 
    <div id="addVersionInfoEntryArea"> 
    </div> 
    <ul id="items"> 
     {{#each items}} 
     <li>{{dbVersion}} | {{tag}}</li> 
     {{/each}} 
    </ul> 
</div> 

而且編輯模板...

<form class="edit-version-info-form"> 
    <h3>Create a new entry</h3> 
    <label for="dbVersion">DB Version</label> 
    <input type="text" id="dbVersion" maxlength="10" /> 
    <label for="tag">Tag</label> 
    <input type="text" id="tag" /> 
    <button type="submit" id="newEntryButton">Create</button> 
</form> 

我是相當新的骨幹,所以我可能會做一些完全錯誤的,但我看不出什麼毛病的辦法,到目前爲止,它不是扔任何錯誤。

OK - 修正了一些facepalming後如下...

define(['ministry', 'jquery', 'models/m-version-info', 'views/about/v-edit-version-info-entry', 'text!templates/version-info/version-info.html'], 
function(Ministry, $, VersionInfo, VersionInfoEditView, TemplateSource) { 
    var versionInfoEntriesView = Ministry.View.extend({ 

     el: '#mainAppArea', 

     template: Handlebars.compile(TemplateSource), 

     versionInfoEditView: null, 

     $addEntryArea: undefined, 
     $addEntryButton: undefined, 

     initialize: function() { 
     }, 

     events: { 
      'click #addVersionInfoEntryButton': 'showAddEntry' 
     }, 

     render: function() { 
      var that = this; 
      var entries = new VersionInfo.Collection(); 

      entries.fetch({ 
       success: function (data) { 
        that.$el.html(that.template({ items: data.toJSON() })); 
        that.$addEntryArea = that.$('#addVersionInfoEntryArea'); 
        that.$addEntryButton = that.$('#addVersionInfoEntryButton'); 
       } 
      }); 

      return this; 
     }, 

     showAddEntry: function (e) { 
      e.preventDefault(); 
      if (this.versionInfoEditView != null) { 
       this.versionInfoEditView.trash(); 
      } 

      this.versionInfoEditView = new VersionInfoEditView({ el: this.$addEntryArea }); 
      this.$addEntryButton.hide(); 
      this.$addEntryArea.append('Do I want to put it here?'); 
      this.versionInfoEditView.render(); 
     } 
    }); 

    return versionInfoEntriesView; 
}); 

問題是由於這樣的事實,我的渲染完成之前設置視圖中的內部元素的變量,所以元素沒有任何聯繫。我解決了這個問題,通過提取元素啓動到渲染成功回調結束。

+0

我找到了一個解決方案。 –

+1

您能否發佈修復程序,以便所有人都能夠找到此問題後才能找到解決方案。請注意,您也可以接受您自己的答案作爲解決方案。 –

+0

這一切都是有限的 - 我在一個小時內回覆它,所以我不能將它作爲答案發布,這有點瘋狂。此問題已在問題結束時發佈。 –

回答

0

這裏的再次修復......

define(['ministry', 'jquery', 'models/m-version-info', 'views/about/v-edit-version-info-entry',  'text!templates/version-info/version-info.html'], 
function(Ministry, $, VersionInfo, VersionInfoEditView, TemplateSource) { 
var versionInfoEntriesView = Ministry.View.extend({ 

    el: '#mainAppArea', 

    template: Handlebars.compile(TemplateSource), 

    versionInfoEditView: null, 

    $addEntryArea: undefined, 
    $addEntryButton: undefined, 

    initialize: function() { 
    }, 

    events: { 
     'click #addVersionInfoEntryButton': 'showAddEntry' 
    }, 

    render: function() { 
     var that = this; 
     var entries = new VersionInfo.Collection(); 

     entries.fetch({ 
      success: function (data) { 
       that.$el.html(that.template({ items: data.toJSON() })); 
       that.$addEntryArea = that.$('#addVersionInfoEntryArea'); 
       that.$addEntryButton = that.$('#addVersionInfoEntryButton'); 
      } 
     }); 

     return this; 
    }, 

    showAddEntry: function (e) { 
     e.preventDefault(); 
     if (this.versionInfoEditView != null) { 
      this.versionInfoEditView.trash(); 
     } 

     this.versionInfoEditView = new VersionInfoEditView({ el: this.$addEntryArea }); 
     this.$addEntryButton.hide(); 
     this.$addEntryArea.append('Do I want to put it here?'); 
     this.versionInfoEditView.render(); 
    } 
}); 

return versionInfoEntriesView; 
}); 

問題是由於這樣的事實,我的渲染完成之前設置視圖中的內部元素的變量,所以元素被鏈接最多沒有。我解決了這個問題,通過提取元素啓動到渲染成功回調結束。

相關問題