tl; dr: Czy możliwe jest utworzenie literału szablonu wielokrotnego użytku?
Próbowałem użyć literałów szablonów, ale wydaje mi się, że po prostu tego nie rozumiem i teraz jestem sfrustrowany. To znaczy, myślę, że to rozumiem, ale „to” nie powinno być tym, jak to działa ani jak powinno. Powinno być inaczej.
Wszystkie przykłady, które widzę (nawet otagowane szablony) wymagają, aby „podstawienia” były wykonywane w czasie deklaracji, a nie w czasie wykonywania, co wydaje mi się całkowicie bezużyteczne dla szablonu. Może jestem szalony, ale „szablon” to dla mnie dokument, który zawiera tokeny, które są podstawiane, gdy go używasz, a nie kiedy go tworzysz, w przeciwnym razie jest to po prostu dokument (tj. Ciąg znaków). Szablon jest przechowywany z tokenami jako tokenami i te tokeny są oceniane, kiedy ... oceniasz go.
Wszyscy cytują okropny przykład podobny do:
var a = 'asd';
return `Worthless ${a}!`
To miłe, ale jeśli już wiem a
, po prostu return 'Worthless asd'
lub return 'Worthless '+a
. Jaki jest sens? Poważnie. Dobra, chodzi o lenistwo; mniej plusów, większa czytelność. Wspaniały. Ale to nie jest szablon! Nie IMHO. A MHO to wszystko, co się liczy! Problem, IMHO, polega na tym, że szablon jest oceniany po zadeklarowaniu, więc jeśli to zrobisz, IMHO:
var tpl = `My ${expletive} template`;
function go() { return tpl; }
go(); // SPACE-TIME ENDS!
Ponieważ expletive
nie jest zadeklarowany, wyświetla coś takiego My undefined template
. Wspaniały. Właściwie przynajmniej w Chrome nie mogę nawet zadeklarować szablonu; zgłasza błąd, ponieważ expletive
nie jest zdefiniowany. Potrzebuję tego, aby móc dokonać zamiany po zadeklarowaniu szablonu:
var tpl = `My ${expletive} template`;
function go() { return tpl; }
var expletive = 'great';
go(); // My great template
Jednak nie widzę, jak to jest możliwe, ponieważ tak naprawdę nie są to szablony. Nawet jeśli mówisz, że powinienem używać tagów, nie, nie działają:
> 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...
To wszystko doprowadziło mnie do przekonania, że literały szablonów są strasznie błędnie nazwane i należy je nazwać tym, czym naprawdę są: heredocami . Wydaje mi się, że „dosłowna” część powinna mnie ostrzec (jak w, niezmienna)?
Czy coś mi brakuje? Czy istnieje (dobry) sposób na utworzenie literału szablonu wielokrotnego użytku?
Daję ci, wielokrotnego użytku literały szablonów :
> 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!
A oto naiwna funkcja „pomocnika” ...
function t(t) { return '`'+t.replace('{','${')+'`'; }
var template = t(`This is
my {expletive} reusable
template!`);
...zrobić to lepiej".
Jestem skłonny nazywać je szablonowymi guterałami ze względu na obszar, z którego wywołują zawirowania.
<strike>
tagu.