Quindi, se non deve essere Mustache, è possibile utilizzare un superset di Moustache chiamato Handlebars.
Prima registrare un aiutante Manubrio:
Handlebars.registerHelper('escapeJs', function(str) {
return str.replace(/[\'\"\\\/]/gm, function (c) {
return '\\' + c;
});
});
E si chiama il proprio aiuto come questo {{escapeJs title}}
:
var view = {
title: "Joe's Lame\"\\/€"
};
var template = Handlebars.compile(
"<a href=\"javascript:confirm('{{escapeJs title}}');\">{{title}}</a>");
var output = template(view);
vederlo dal vivo in questo fiddle.
Moustache è davvero bello ed è disponibile in quasi tutti i linguaggi di programmazione. I manubri sono fantastici e vengono utilizzati per es. in Backbone Thorax e assemble, un potente generatore di siti Web statici.
Edit: soluzione alternativa
Quando si utilizza ECMAScript 5 (e con spessoramento/shiv/polyfills che dovrebbero lavorare con IE8 pure), si potrebbe preparare la vista-oggetto per Moustache nel modo seguente. Ammetto che questa non è una soluzione molto comoda, ma quando si produce un output JavaScript è raro, potrebbe essere accettabile IMO.
function escapeJs (str) {
return str.replace(/[\'\"\\\/]/gm, function (c) {
return '\\' + c;
});
}
var view = {
title: "Joe's Lame"
};
Object.defineProperty(view, 'titleJsEnc', {
enumerable: false,
get: function() { return escapeJs(this.title); }
});
var output = Mustache.render(
"<a href=\"javascript:confirm('{{titleJsEnc}}');\">{{title}}</a>", view);
Definizione di una nuova proprietà (via Object.defineProperty) fa il trucco. Si potrebbe scrivere un decoratore di oggetti generici che definisce un getter per ogni proprietà reale che restituisce il valore di stringa di escape.
Ecco la Modifica fiddle
: Alternativa: aspettare una nuova versione di Baffi
Una volta che questo pull-request si fonde e una nuova versione di Baffi è pubblicato, questo problema dovrebbe essere risolto in un "Modo nativo dei baffi".
Interessante! Suppongo che questo non sia possibile con Moustache. Non dovrebbe essere un grosso problema con Handlebars ('Handlebars.registerHelper') ... – hgoebl
@hgoebl, la soluzione non deve essere Mustache. –
Quindi dovresti dare un'occhiata a [Handlebars] (http://handlebarsjs.com/). È un superset di Moustache e può essere esteso molto facilmente. Dovresti creare e registrare una funzione di supporto come 'escapeJs' e nel tuo modello usarla come' {{escapeJS title}} '. Se trovo il tempo, ti forzo il tuo violino ... – hgoebl