2012-03-26 10 views
1

ich von Require.js über diese geladen Template-Datei haben:Handlebars.js vermisst JSON-Daten

Haupt app.js

define([ 
     'backboneLoader', 
     'handlebars', 
     'text!templates/main.html', 
     'text!appdata.json' 
    ], 
    function(
     Backbone, 
     Handlebars, 
     MainTemplate, 
     AppData 
    ) { 
     "use strict"; 

     return Backbone.View.extend({ 
      initialize : function() { 
       this.render(); 
      }, 

      render : function() { 
       var template = Handlebars.compile(MainTemplate); 
       var output = template(AppData); 
       this.$el.append(output); 
       console.log("appData:\n" + AppData); 
       console.log("MainTemplate:\n" + MainTemplate); 
       console.log("Output:\n" + output); 
        //smth extra 
       return this; 
      } 
     }); 
    } 
); 

MainTemplate (main.html)

<ul> 
    <li><b>Version:</b> {{version}}</li> 
    <li><b>Author:</b> {{author}}</li> 
</ul> 

AppData (appdata.json)

{version: "0.0.1", author: "John Doe"} 

und Ausgang:

<ul> 
    <li><b>Version:</b></li> 
    <li><b>Author:</b></li> 
</ul> 

Während erwartete Ausgabe:

<ul> 
     <li><b>Version:</b> 0.0.1</li> 
     <li><b>Author:</b> John Doe</li> 
</ul> 

Irgendwelche Ideen, was mache ich falsch? Vielen Dank!

UPD: Problem gelöst. Hier wird aktualisiert Haupt app.js:

define([ 
     'backboneLoader', 
     'handlebars', 
     'text!templates/main.html!strip', 
     'text!appdata.json' 
    ], 
    function(
     Backbone, 
     Handlebars, 
     mainTemplate, 
     appData 
    ) { 
     "use strict"; 

     return Backbone.View.extend({ 
      initialize : function() { 
       this.render(); 
      }, 

      render : function() { 
       var template = Handlebars.compile(mainTemplate); 
       var output = template(eval("(" + appData + ")")); //Object is expected by template(), not JSON. 
       this.$el.append(output); 
       console.log("appData:\n" + appData); 
       console.log("template:\n" + mainTemplate); 
       console.log("Output:\n" + output); 
        //smth extra 
       return this; 
      } 
     }); 
    } 
); 
+0

Problem gelöst. Ich habe gerade ersetzt: var output = template (AppData); mit: var output = Vorlage (eval ("(" + appData + ")")); –

+0

Bitte 'eval' nicht benutzen! Dies ist eine schlechte Vorgehensweise und stellt eine Sicherheitslücke dar, denn wenn ein beliebiges JavaScript im Text enthalten ist, wird es ausgewertet. Besser ist es 'JSON.parse (appData)' zu verwenden. Möglicherweise müssen Sie 'json2.js' hinzufügen, um JSON-Unterstützung für ältere Browser (<= IE7) hinzuzufügen: https://github.com/douglascrockford/JSON-js/ – frontendbeauty

Antwort

0

hier ein jsFiddle repro Ihrer Template-Funktion ist, scheint die Vorlage Transformationen arbeiten, wird das Problem wahrscheinlich im Text zu finden! Funktion in require.js Code, versuchen Sie den Text zu debuggen! Funktion.

Versuchen Sie auch den Streifen Funktion hinzuzufügen, wenn die Vorlage geladen: 'Textvorlagen/main.html Streifen!',

Die Dokumentation schlägt vor: For HTML/XML/SVG files, there is another option. You can pass !strip, which strips XML declarations so that external SVG and XML documents can be added to a document without worry.

+0

Vielen Dank für Ihre Antwort! Aber nichts hilft. Aus Gründen immer noch lauern. Scheint mit "text! AppData.json" etwas falsch zu sein. –

1

Das Problem ist AppData ist ein String von JSON, kein tatsächliches Objekt. Einfach aus ändern:

var output = template(AppData);

zu

var output = template(JSON.parse(AppData));

können Sie benötigen json2.js enthalten JSON-Unterstützung für ältere Browser (< = IE7) hinzuzufügen.

Verwandte Themen