2012-07-23 16 views
9

Hey Leute!Rendering-Vorlagen in den Helfern im Lenker

Da scheint es keine Antwort zu geben: Passing variables through handlebars partial noch arbeite ich derzeit an einer kleinen Problemumgehung, um diese Arbeit zu bekommen. Die Idee besteht also darin, eine Hilfsfunktion zu registrieren, die eine bestimmte Vorlage mit möglichen Werten rendert. Ein Bit-Code macht es besser zu verstehen.

Dies ist, wie ich meine ein Helfer aufgerufen würde:

<div> 
    {{myHelper}} 
</div> 

Dieser Helfer mit diesem kleinen Code registriert ist:

hbs.registerHelper(name, function (args) { 
    args = args || {}; 
    var template = hbs.compile(fs.readFileSync(__dirname + '/' + file, 'utf8')); 
    return template(args); 
}); 

ich diesen snippiet in eine Schleife stellen verschiedene Helfer registrieren Einmal. Dies bedeutet, dass 'Name' und 'Datei' angegeben sind.

Okay, jetzt bin ich in der Lage, so etwas zu tun:

// 'values' could be something like this: 

var values = { headline: 'HEADLINE' } 

<div> 
    {{myHelper values}} 
</div> 

Innerhalb eines Helfer kann ich jetzt testen, ob eine bestimmte Werte gegeben:

// myHelper template 

<div> 
    {{#if headline}} 
    <h1>{{headline}}</h1> 
    {{/if}} 
    <p>Lorem ipsum</p> 
</div> 

Diese kleine Abhilfe für mich funktioniert aber es gibt ein Problem. Wenn Sie einen Helper wie oben beschrieben registrieren, wird eine einfache HTML-Escaped-Zeichenfolge zurückgegeben. Wenn also ein Helfer aufgerufen wird, wird kein gerenderter HTML-Code ausgegeben. Es gibt das HTML als eine Escapezeichenfolge aus.

Hat jemand von euch eine Idee, wie ich meinen Code-Ausschnitt den HTML-Code als HTML zurückgeben kann?

/Pascal

Antwort

20

Von Handlebars doc:

Lenker keinen Handlebars.SafeString entkommen. Wenn Sie einen Helfer schreiben, der sein eigenes HTML erzeugt, werden Sie normalerweise einen neuen Handlebars.SafeString (Ergebnis) zurückgeben wollen. In solch einem Fall möchten Sie die Parameter manuell verlassen.

Versuchen

hbs.registerHelper(name, function (args) { 
    args = args || {}; 
    var template = hbs.compile(fs.readFileSync(__dirname + '/' + file, 'utf8')); 

    // return new hbs.SafeString(template(args)); 
    // From @Maroshii 
    // the SafeString method must be accessed through hbs.handlebars 
    // and not directly through hbs 
    // https://github.com/donpark/hbs#handlebars 

    return new hbs.handlebars.SafeString(template(args)); 
}); 
+0

Ja! Das ist für mich in Ordnung! Vielen Dank Alter! – PascalPrecht

+10

Wenn es funktioniert, markieren Sie die Antwort entsprechend – brafales

+0

Nur für den Fall, dass jemand in diese ... läuft. Die SafeString-Methode muss über 'hbs.handlebars' und nicht direkt über' hbs' aufgerufen werden ... das ist für Knoten. js users :) – Maroshii

24

Ich möchte nur darauf hinweisen, dass Triple-Klammern entfällt die Notwendigkeit, irgendwelche zusätzlichen Methoden ausführen, um HTML zu konvertieren. Wenn Sie beispielsweise auf die Vorlagedaten zugreifen, verwenden Sie einfach die dreifachen geschweiften Klammern {{{templateData}}}, mit der Sie HTML-Rohdaten abrufen können.

+0

Das hat mir geholfen meine Antwort zu finden! TY – Fasani