2017-02-13 3 views
0

Ich bekomme 2 Vorlagen: eine für ein Formular und eine für eine Zeile für das Ergebnis. So ist meine Sichtweise. Das Formular wird angezeigt, aber wenn ich eine Zeile habe, bekomme ich nur eine statische Vorlage dieser Zeile, ich meine, die <% = key %> funktioniert nicht und das Formular verschwinden.Verwenden von jQuery.load zum Anzeigen einer Vorlage in einer anderen Vorlage

APP.FromFront = Backbone.View.extend({ 
    el: $("#content"), 
    events: { 
     "click #addLink" : "addLink", 
     "click .deleteLink" : "deleteLink" 
    }, 
    template: _.template($('#content').html()), 

    initialize: function() { 
     this.bookmarks = new APP.BookmarksCollection(); 
     this.render(); 
    }, 
    render: function() { 
     this.$el.html(this.$el.load("../../templates/form_template.html")); 
     this.bookmarks.each(function(bookmark) { 
      var bookJSON = bookmark.toJSON(); 
      **//############ this is where it's doesn't work** 
      var temp=_.template(this.$el.load("../../templates/links_template.html")); 
      $("#links").append(temp(bookJSON)); 
     },this); 
    }, 
}) 
+0

Warum haben Sie eine unbenutzte 'Vorlage: _.template ($ ('# content'). Html()),'? Warum versuchen Sie, eine externe Datei zu laden, anstatt sie zu verwenden? Verstehst du, wie ['load'] (http://api.jquery.com/load/) funktioniert? Nach Code wie "this. $ El.html (this. $ El.load (url))" zu urteilen, denke ich nicht. Ist dir klar, dass unser Code immer wieder die gleiche Vorlage holt? Obwohl der Browser es möglicherweise zwischenspeichert, ist es keine gute Übung. ['load'] (http://api.jquery.com/load/) ist asynchron. Bitte lesen Sie zuerst die Dokumentation. –

+0

Danke für die Antwort. Ich wurde die Vorlage "Vorlage" verwendet, wenn meine Vorlage auf der Seite index.html war. Es ist in diesem Code nicht verwendet. Ich möchte es nicht wirklich laden, aber benutze es. Ich weiß, wie es geht, wenn es in der index.html aber nicht in einer anderen Datei ist. – BoltMaud

Antwort

2

load ist asynchron. Sie müssen damit umgehen. Außerdem sollten Sie die Vorlage zwischenspeichern, sobald sie geladen ist, als zu versuchen, die gleiche Vorlage wiederholt zu holen. Versuchen Sie etwas wie folgt:

APP.FromFront = Backbone.View.extend({ 
    el: $("#content"), 
    events: { 
    "click #addLink": "addLink", 
    "click .deleteLink": "deleteLink" 
    }, 
    initialize: function() { 
    this.bookmarks = new APP.BookmarksCollection(); 
    this.formTemplatePromise = $.get("../../templates/form_template.html"); 
    this.linkTemplatePromise = $.get("../../templates/links_template.html"); 
    $.when(this.formTemplatePromise, this.linkTemplatePromise) 
    .then(function(formTemplate, linkTemplate) { 
     this.formTemplate = _.template(formTemplate); 
     this.linkTemplate = _.template(linkTemplate); 
     this.render(); 
    }.bind(this)); 
    }, 
    render: function() { 
    this.$el.html(this.formTemplate(/* form data here? */)); 
    var links = []; 
    this.bookmarks.each(function(bookmark) { 
     // below code can be made a 1 liner, I split it for readability 
     var bookJSON = bookmark.toJSON(); 
     var link = this.linkTemplate(bookJSON); 
     links.push(link); 
    }, this); 
    // Single append instead of many for performance 
    $("#links").append(links); 
    } 
}); 
+0

Ich habe keine Daten für das formTemplate. Ich habe es versucht, aber es funktioniert nicht so gut. Ich bekomme wirklich oft den Fehler "n ist nicht definiert von Unterstrich-min.js" und mit Ihrem Code habe ich "n.replace ist keine Funktion" Nochmals vielen Dank – BoltMaud

+0

Mit dieser Option bekomme ich nicht das Formular – BoltMaud

+0

@ BoltMaud Welche Version von Unterstrich verwenden Sie? Ich nahm an, dass Sie die neueste Version verwenden. Es gab eine API-Änderung, siehe diese Antwort http://stackoverflow.com/a/25881231/2333214 –

Verwandte Themen