tl; dr: Có thể tạo mẫu có thể tái sử dụng theo nghĩa đen không?
Tôi đã cố gắng sử dụng các ký tự mẫu nhưng tôi đoán là tôi không hiểu và bây giờ tôi đang thất vọng. Ý tôi là, tôi nghĩ rằng tôi hiểu được nó, nhưng "nó" không nên là cách nó hoạt động, hay nó sẽ nhận được như thế nào. Nó sẽ khác đi.
Tất cả các ví dụ tôi thấy (ngay cả các mẫu được gắn thẻ) yêu cầu "thay thế" được thực hiện tại thời điểm khai báo chứ không phải thời gian chạy, điều này dường như hoàn toàn vô dụng đối với tôi đối với một mẫu. Có lẽ tôi bị điên, nhưng "mẫu" đối với tôi là một tài liệu có chứa các mã thông báo được thay thế khi bạn sử dụng nó, không phải khi bạn tạo nó, nếu không nó chỉ là một tài liệu (tức là một chuỗi). Một mẫu được lưu trữ với các mã thông báo dưới dạng mã thông báo & các mã thông báo đó được đánh giá khi bạn ... đánh giá nó.
Mọi người đều trích dẫn một ví dụ khủng khiếp tương tự như:
var a = 'asd';
return `Worthless ${a}!`
Điều đó thật tuyệt, nhưng nếu tôi đã biết a
, tôi sẽ chỉ return 'Worthless asd'
hoặc return 'Worthless '+a
. Vấn đề ở đây là gì? Nghiêm túc. Được rồi, vấn đề là sự lười biếng; ít điểm cộng hơn, dễ đọc hơn. Tuyệt quá. Nhưng đó không phải là một khuôn mẫu! Không phải IMHO. Và MHO là tất cả những gì quan trọng! Vấn đề, IMHO, là mẫu được đánh giá khi nó được khai báo, vì vậy, nếu bạn làm vậy, IMHO:
var tpl = `My ${expletive} template`;
function go() { return tpl; }
go(); // SPACE-TIME ENDS!
Vì expletive
không được khai báo, nó xuất ra một cái gì đó giống như My undefined template
. Siêu. Trên thực tế, ít nhất trong Chrome, tôi thậm chí không thể khai báo mẫu; nó ném ra một lỗi vì expletive
không được xác định. Những gì tôi cần là có thể thực hiện thay thế sau khi khai báo mẫu:
var tpl = `My ${expletive} template`;
function go() { return tpl; }
var expletive = 'great';
go(); // My great template
Tuy nhiên, tôi không thấy làm thế nào điều này có thể thực hiện được, vì đây không thực sự là các mẫu. Ngay cả khi bạn nói tôi nên sử dụng thẻ, nope, chúng không hoạt động:
> 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ất cả những điều này đã khiến tôi tin rằng các nghĩa đen của khuôn mẫu được đặt tên sai một cách khủng khiếp và nên được gọi như chúng thực sự là: heredocs . Tôi đoán phần "nghĩa đen" lẽ ra phải cho tôi biết (như trong, bất biến)?
Tui bỏ lỡ điều gì vậy? Có cách nào (tốt) để tạo một mẫu có thể tái sử dụng theo nghĩa đen không?
Tôi cung cấp cho bạn, các ký tự mẫu có thể tái sử dụng :
> 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!
Và đây là một chức năng "helper" ngây thơ ...
function t(t) { return '`'+t.replace('{','${')+'`'; }
var template = t(`This is
my {expletive} reusable
template!`);
...Để làm cho nó tốt hơn".
Tôi có xu hướng gọi chúng là guteral mẫu vì khu vực mà chúng tạo ra cảm giác uốn lượn.
<strike>
thẻ.