tl; dr: เป็นไปได้ไหมที่จะสร้างเทมเพลตที่ใช้ซ้ำได้?
ฉันพยายามใช้ตัวอักษรเทมเพลต แต่ฉันคิดว่าฉันไม่เข้าใจและตอนนี้ฉันเริ่มหงุดหงิด ฉันหมายถึงฉันคิดว่าฉันเข้าใจแล้ว แต่ "มัน" ไม่ควรเป็นวิธีการทำงานหรือวิธีที่ควรได้รับ มันควรจะได้รับที่แตกต่างกัน
ตัวอย่างทั้งหมดที่ฉันเห็น (แม้แต่เทมเพลตที่ติดแท็ก) กำหนดให้ "การแทนที่" ต้องทำในเวลาประกาศไม่ใช่เวลาทำงานซึ่งดูเหมือนว่าไม่มีประโยชน์สำหรับฉันสำหรับเทมเพลต บางทีฉันอาจจะบ้า แต่ "เทมเพลต" สำหรับฉันคือเอกสารที่มีโทเค็นซึ่งถูกแทนที่เมื่อคุณใช้ไม่ใช่เมื่อคุณสร้างมันมิฉะนั้นจะเป็นเพียงเอกสาร (เช่นสตริง) เทมเพลตจะถูกเก็บไว้กับโทเค็นเนื่องจากโทเค็นและโทเค็นเหล่านั้นจะได้รับการประเมินเมื่อคุณ ... ประเมินมัน
ทุกคนยกตัวอย่างที่น่ากลัวคล้ายกับ:
var a = 'asd';
return `Worthless ${a}!`
นั่นเป็นเรื่องดี แต่ถ้าผมรู้อยู่แล้วว่าa
ผมจะเพียงหรือreturn 'Worthless asd'
return 'Worthless '+a
ประเด็นคืออะไร? อย่างจริงจัง. โอเคประเด็นคือความเกียจคร้าน ข้อดีน้อยลงอ่านได้ง่ายขึ้น ยิ่งใหญ่ แต่นั่นไม่ใช่แม่แบบ! ไม่ใช่ IMHO และ MHO คือทุกสิ่งที่สำคัญ! ปัญหา IMHO คือเทมเพลตจะได้รับการประเมินเมื่อมีการประกาศดังนั้นหากคุณทำ IMHO:
var tpl = `My ${expletive} template`;
function go() { return tpl; }
go(); // SPACE-TIME ENDS!
เนื่องจากไม่ได้รับการประกาศมันจะออกผลลัพธ์บางอย่างเช่นexpletive
My undefined template
ซูเปอร์ จริงๆแล้วใน Chrome อย่างน้อยฉันก็ประกาศแม่แบบไม่ได้ มันแสดงข้อผิดพลาดเนื่องจากexpletive
ไม่ได้กำหนดไว้ สิ่งที่ฉันต้องการคือสามารถทำการทดแทนได้หลังจากประกาศเทมเพลต:
var tpl = `My ${expletive} template`;
function go() { return tpl; }
var expletive = 'great';
go(); // My great template
อย่างไรก็ตามฉันไม่เห็นว่ามันเป็นไปได้อย่างไรเนื่องจากสิ่งเหล่านี้ไม่ใช่เทมเพลตจริงๆ แม้ว่าคุณจะบอกว่าฉันควรใช้แท็ก แต่ก็ไม่ได้ผล:
> 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...
ทั้งหมดนี้ได้นำให้เชื่อว่าตัวอักษรแม่แบบจะเรียกไม่ถูกอย่างน่ากลัวและควรจะเรียกว่าสิ่งที่พวกเขาเป็นจริง: heredocs ฉันเดาว่าส่วนที่เป็น "ตัวอักษร" น่าจะทำให้ฉันขาดหายไป (เหมือนเดิมไม่เปลี่ยนรูป)?
ฉันพลาดอะไรไปรึเปล่า? มีวิธี (ที่ดี) ในการสร้างเทมเพลตแบบใช้ซ้ำได้หรือไม่?
ฉันให้ตัวอักษรแม่แบบที่ใช้ซ้ำได้ :
> 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!
และนี่คือฟังก์ชั่น "ตัวช่วย" ที่ไร้เดียงสา ...
function t(t) { return '`'+t.replace('{','${')+'`'; }
var template = t(`This is
my {expletive} reusable
template!`);
... เพื่อให้ "ดีขึ้น".
ฉันมีแนวโน้มที่จะเรียกพวกเขาว่าแม่แบบ guterals เนื่องจากพื้นที่ที่พวกเขาสร้างความรู้สึกที่บิดเบี้ยว
<strike>
แท็ก