tl; dr: É possível tornar literal um modelo reutilizável?
Tenho tentado usar literais de modelo, mas acho que não entendi e agora estou ficando frustrado. Quer dizer, acho que entendi, mas "isso" não deveria ser como funciona, ou como deveria ser. Deve ser diferente.
Todos os exemplos que vejo (mesmo os modelos marcados) exigem que as "substituições" sejam feitas no momento da declaração e não no tempo de execução, o que me parece totalmente inútil para um modelo. Talvez eu esteja louco, mas um "modelo" para mim é um documento que contém tokens que são substituídos quando você o usa, não quando você cria, caso contrário, é apenas um documento (ou seja, uma string). Um modelo é armazenado com os tokens como tokens e esses tokens são avaliados quando você ... avalia.
Todo mundo cita um exemplo horrível semelhante a:
var a = 'asd';
return `Worthless ${a}!`
Isso é bom, mas se eu já souber a
, eu apenas return 'Worthless asd'
ou return 'Worthless '+a
. Qual é o ponto? Seriamente. Ok, o ponto é preguiça; menos vantagens, mais legibilidade. Ótimo. Mas isso não é um modelo! Não IMHO. E MHO é tudo o que importa! O problema, IMHO, é que o modelo é avaliado quando é declarado, então, se o fizer, IMHO:
var tpl = `My ${expletive} template`;
function go() { return tpl; }
go(); // SPACE-TIME ENDS!
Uma vez que expletive
não é declarado, ele produz algo como My undefined template
. Super. Na verdade, pelo menos no Chrome, não consigo nem declarar o template; ele lança um erro porque expletive
não está definido. O que eu preciso é ser capaz de fazer a substituição após declarar o modelo:
var tpl = `My ${expletive} template`;
function go() { return tpl; }
var expletive = 'great';
go(); // My great template
No entanto, não vejo como isso é possível, já que esses não são realmente modelos. Mesmo quando você diz que devo usar tags, não, elas não funcionam:
> 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...
Tudo isso me levou a acreditar que os literais de modelo têm nomes horrivelmente errados e deveriam ser chamados do que realmente são: heredocos . Eu acho que a parte "literal" deveria ter me avisado (como em, imutável).
Estou esquecendo de algo? Existe uma (boa) maneira de tornar literal um modelo reutilizável?
Eu te dou, literais de modelo reutilizáveis :
> 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!
E aqui está uma função ingênua de "auxiliar" ...
function t(t) { return '`'+t.replace('{','${')+'`'; }
var template = t(`This is
my {expletive} reusable
template!`);
... para torná-lo "melhor".
Estou inclinado a chamá-los de gutais de modelo por causa da área a partir da qual eles produzem sentimentos tortuosos.
<strike>
tag.