tl; dr: Yeniden kullanılabilir bir şablonu değişmez yapmak mümkün müdür?
Şablon değişmezlerini kullanmaya çalışıyordum ama sanırım anlamıyorum ve şimdi sinirleniyorum. Demek istediğim, anladığımı düşünüyorum, ama "o" nasıl çalıştığı veya nasıl olması gerektiği olmamalı. Farklı şekilde olmalı.
Gördüğüm tüm örnekler (etiketli şablonlar bile) "ikamelerin" bildirim zamanında yapılmasını ve çalışma zamanında yapılmamasını gerektiriyor, ki bu bana bir şablon için tamamen yararsız geliyor. Belki deliyim, ama benim için "şablon", onu yarattığınızda değil, kullandığınızda değiştirilen belirteçleri içeren bir belgedir, aksi takdirde sadece bir belgedir (yani bir dizedir). Bir şablon, jeton olarak jetonlarla birlikte saklanır ve bu jetonlar, siz onu değerlendirdiğinizde değerlendirilir.
Herkes şuna benzer korkunç bir örnek veriyor:
var a = 'asd';
return `Worthless ${a}!`
Bu güzel, ama zaten biliyorsam a
, sadece return 'Worthless asd'
ya da yapardım return 'Worthless '+a
. Amaç ne? Ciddi anlamda. Tamam mesele tembellik; daha az artı, daha fazla okunabilirlik. Harika. Ama bu bir şablon değil! IMHO değil. Ve MHO önemli olan tek şey! Sorun, IMHO, şablonun ilan edildiğinde değerlendirilmesidir, bu nedenle, eğer yaparsanız, IMHO:
var tpl = `My ${expletive} template`;
function go() { return tpl; }
go(); // SPACE-TIME ENDS!
Yana expletive
bildirilmedi, şöyle birşeyler verir My undefined template
. Süper. Aslında, en azından Chrome'da şablonu beyan edemiyorum; expletive
tanımlı olmadığı için bir hata atar . İhtiyacım olan şey, şablonu beyan ettikten sonra değişikliği yapabilmektir:
var tpl = `My ${expletive} template`;
function go() { return tpl; }
var expletive = 'great';
go(); // My great template
Ancak bunun nasıl mümkün olduğunu anlamıyorum çünkü bunlar gerçekten şablonlar değil. Etiketleri kullanmam gerektiğini söyleseniz bile, hayır, işe yaramıyorlar:
> 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...
Tüm bunlar beni şablon değişmezlerinin korkunç bir şekilde yanlış adlandırıldığına ve gerçekte oldukları gibi adlandırılmaları gerektiğine inandırdı: heredoc . Sanırım "literal" kısmı beni uyarmalıydı (olduğu gibi, değişmez)?
Bir şey mi kaçırıyorum? Yeniden kullanılabilir bir şablonu değişmez hale getirmenin (iyi) bir yolu var mı?
Size yeniden kullanılabilir şablon değişmezlerini veriyorum :
> 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!
Ve işte saf bir "yardımcı" işlevi ...
function t(t) { return '`'+t.replace('{','${')+'`'; }
var template = t(`This is
my {expletive} reusable
template!`);
...daha iyi yapmak için".
Kıvrımlı hisler ürettikleri alan nedeniyle onlara şablon guterals demeye meyilliyim.
<strike>
etikete koyun .