tl; dr: È possibile rendere letterale un modello riutilizzabile?
Ho provato a utilizzare i letterali modello ma immagino di non capirlo e ora mi sto frustrando. Voglio dire, penso di aver capito, ma "non" dovrebbe essere come funziona o come dovrebbe essere. Dovrebbe andare diversamente.
Tutti gli esempi che vedo (anche i modelli contrassegnati) richiedono che le "sostituzioni" siano fatte al momento della dichiarazione e non al tempo di esecuzione, il che mi sembra del tutto inutile per un modello. Forse sono pazzo, ma un "modello" per me è un documento che contiene token che vengono sostituiti quando lo usi, non quando lo crei, altrimenti è solo un documento (cioè una stringa). Un modello viene memorizzato con i token come token e quei token vengono valutati quando tu ... lo valuti.
Tutti citano un orribile esempio simile a:
var a = 'asd';
return `Worthless ${a}!`
È carino, ma se lo so già a
, vorrei solo return 'Worthless asd'
o return 'Worthless '+a
. Qual e il punto? Sul serio. Va bene, il punto è la pigrizia; meno vantaggi, più leggibilità. Grande. Ma non è un modello! Non IMHO. E MHO è tutto ciò che conta! Il problema, IMHO, è che il modello viene valutato quando viene dichiarato, quindi, se lo fai, IMHO:
var tpl = `My ${expletive} template`;
function go() { return tpl; }
go(); // SPACE-TIME ENDS!
Poiché expletive
non è dichiarato, restituisce qualcosa di simile My undefined template
. Super. In realtà, almeno in Chrome, non posso nemmeno dichiarare il modello; genera un errore perché expletive
non è definito. Quello di cui ho bisogno è essere in grado di eseguire la sostituzione dopo aver dichiarato il modello:
var tpl = `My ${expletive} template`;
function go() { return tpl; }
var expletive = 'great';
go(); // My great template
Tuttavia non vedo come sia possibile, poiché questi non sono realmente modelli. Anche quando dici che dovrei usare i tag, no, non funzionano:
> explete = function(a,b) { console.log(a); console.log(b); }
< function (a,b) { console.log(a); console.log(b); }
> var tpl = explete`My ${expletive} template`
< VM2323:2 Uncaught ReferenceError: expletive is not defined...
Tutto ciò mi ha portato a credere che i letterali modello siano orribilmente errati e dovrebbero essere chiamati per quello che sono realmente: heredocs . Immagino che la parte "letterale" dovrebbe avermi avvertito (come in, immutabile)?
Mi sto perdendo qualcosa? C'è un (buon) modo per rendere letterale un modello riutilizzabile?
Ti do, modelli letterali riutilizzabili :
> function out(t) { console.log(eval(t)); }
var template = `\`This is
my \${expletive} reusable
template!\``;
out(template);
var expletive = 'curious';
out(template);
var expletive = 'AMAZING';
out(template);
< This is
my undefined reusable
template!
This is
my curious reusable
template!
This is
my AMAZING reusable
template!
Ed ecco una ingenua funzione di "aiuto" ...
function t(t) { return '`'+t.replace('{','${')+'`'; }
var template = t(`This is
my {expletive} reusable
template!`);
... per renderlo "migliore".
Sono incline a chiamarli guterals modello a causa dell'area da cui producono sentimenti tortuosi.
<strike>
tag.