2012-07-23 11 views
9

Ehi ragazzi!Modelli di rendering all'interno di helper nel manubrio

Perché sembra che non ci siano risposte su questo: Passing variables through handlebars partial ancora, al momento sto lavorando a una piccola soluzione per ottenere questo lavoro. Quindi, l'idea è di registrare una funzione di supporto che restituisce un modello specifico con possibili valori. Un codice bit rende meglio capire.

Questo è come un avrei invoco il mio aiuto:

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

questo helper è registrato con questo po 'di codice:

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

ho messo questo snippiet in un ciclo di registrare aiutanti diversi a una volta. Questo significa 'nome' e 'file' è dato.

Ok ora sono in grado di fare qualcosa del genere:

// 'values' could be something like this: 

var values = { headline: 'HEADLINE' } 

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

All'interno di un aiuto Ora posso verificare se è dato un certo valore:

// myHelper template 

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

Questa piccola soluzione funziona per me ma c'è un problema Registrando un helper come spiegato sopra, viene restituita una stringa di escape HTML semplice. Pertanto, l'invocazione di un helper non genera uno snippet HTML reso. Emette l'HTML come stringa di escape.

Qualcuno di voi ha un'idea di come posso rendere il mio snippet di codice restituire l'HTML come HTML?

/Pascal

risposta

20

Da Handlebars doc:

I manubri non si sfuggire a una Handlebars.SafeString. Se si scrive un helper che genera il proprio codice HTML, di solito si desidera restituire un nuovo handlebars.SafeString (risultato) in genere a . In tale circostanza, , è necessario eseguire manualmente i parametri di escape.

Prova

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

Sì! Per me va bene! Grazie mille amico! – PascalPrecht

+10

Se ha funzionato, contrassegnare la risposta di conseguenza – brafales

+0

Nel caso qualcuno si imbattesse in questo .... Il metodo 'SafeString' deve essere accessibile tramite' hbs.handlebars' e non direttamente tramite 'hbs' ... questo è per il nodo. js users :) – Maroshii

24

vorrei solo far notare che l'utilizzo di staffe triple elimina la necessità di eseguire eventuali ulteriori metodi per la conversione in HTML. Ad esempio, quando si accede ai dati del modello, utilizzare solo le parentesi graffe triple {{{templateData}}}, che consente di ottenere HTML non elaborato.

+0

Questo mi ha aiutato a trovare la risposta! TY – Fasani

Problemi correlati