2013-03-27 5 views
5

In meinem Backbone Ansicht habe ich:Underscore.js Uncaught Typeerror: Die Methode kann nicht nennen ‚ersetzen‘ undefinierter

noteTemplate: _.template($('#note-template').html()),

Welche diesen Fehler zu werfen. Die Vorlage ist:

<script type="text/template" id="note-template"> 
    <div class="reminder"> 
     <div class="reminder-hover"> 
      <div class="title"><%= title %></div> 
      <div class="created">Created 3 days ago <span class="pull-right"> In 3 hours</span></div> 
     </div> 
     <span class="id" style="display: none;"><%= id %></span> 
    </div> 
</script> 

Ich bin verwirrt, weil dies in meiner Konsole funktioniert:

>> _.template($('#note-template').html());
function (n){return e.call(this,n,w)}

Hier ist der der vollständige Code:

App.Views.Index = Backbone.View.extend({ 

    el: $("div.reminders"), 
    todays : $("span.today"), 
    tomorrows : $("span.tomorrow"), 
    weeks : $("span.week"), 
    all_times : $("span.all-time"), 

    noteTemplate: _.template($('#note-template').html()), 


    events: { 
     "click .reminder" : "editNote", 
     "click .newNote" : "newNote" 
    }, 

    initialize : function() { 
     _.bindAll(this, 'render'); 
     this.notes = this.options.notes; 
     this.listenTo(this.model, 'change', this.render); 
    }, 

    render : function() { 
     // Hide things related to editing a note 
     this.$("[name=content]").hide().val(""); 
     this.$("[name=title]").hide().val(""); 
     this.$("save1").hide(); 
     this.$("close1").hide(); 

     // Fill in content 
     this.$el.html(this.noteTemplate(this.model.toJSON())); 
     this.$todays.html(collection.getTodays.length); 
     this.$tomorrows.html(collection.getTomorrows.length); 
     this.$weeks.html(collection.getWeeks.length); 
     this.$all_times.html(collection.getAllTimes.length); 
     return this; 
    }, 

    editNote : function() { 
     this.goTo("notes/"+this.model.id); 
    }, 

    newNote : function(){ 
     this.goTo("newNote"); 
    } 

}); 

Antwort

16

Anstatt zu versuchen, Um den HTML-Code der Notizvorlage bei der Definition der Methode zwischenzuspeichern, tun Sie dies, wenn Sie die Ansicht initialisieren.

initialize : function() { 
    // ... 
    this.nodeTemplate = _.template($('#note-template').html()); 
} 

Es ist sehr wahrscheinlich, dass Sie die Ansicht vor dem DOM sind zu definieren (und damit die Schablone) geladen wird.

+0

Das völlig mir entfallen. Vielen Dank! – Nonconformist

2

Eine andere Lösung ist die Tag-Skript über der Anrufansicht bewegen, so (ich bin mit Jade)

script#page-thumb(type='text/template') 
    .page-thumb-container.relative 
     .page-thumb 
     .image 
      figure 
      img(src='{{ image }}' , width='80px',height='60px' , data-id='{{ id }}') 
      span.title {{ title }} 
     .page-dragger.absolute 

script(src='js/src/views/PageThumbView.js') 
Verwandte Themen