2016-10-11 2 views
1

Скажем, у меня есть шаблон буквального, как так:оценивающих литералы шаблона динамически

const val = `string text ${expression} string text` 

Я хочу, чтобы динамически оценивать шаблон буквального в законченную строку.

function toFoo(templateLiteral){ 
    //returns "string text Foo string text" 
    return templateLiteral.evaluate('Foo'); 
} 

function toBar(templateLiteral){ 
    //returns "string text Bar string text" 
    return templateLiteral.evaluate('Bar'); 
} 

function toBaz(templateLiteral){ 
    //returns "string text Baz string text" 
    return templateLiteral.evaluate('Baz'); 
} 

Есть ли способ сделать что-то подобное с использованием шаблонных литералов, или я просто тупой? (template.evaluate() - созданная функция, но я ищу такую ​​функциональность с помощью JS!).

+0

Сортировка звуков, как общая функция замены нет? – peteb

+0

Но ... не будет ли шаблонный литерал (как и все литералы) оцениваться в том месте, где он появляется, создавая строку, которая не знает, что она появилась из литерала? – nnnnnn

+0

, вероятно, нет, если он завернут в функцию :) –

ответ

0

Я предполагаю, что лучший способ сделать это совершенно очевидно, просто измените ситуацию, заданную вопросом. Вам просто нужно обернуть литералы шаблона функцией, а затем вы отложите оценку до тех пор, пока не перейдете в нужные параметры. Это так просто.

function evaluteTemplateLiteral(bar){ 
    return `foo ${bar} baz`; 
} 

теперь, если вы хотите, чтобы получить новые идеи, можно создать так:

function evaluateGeneric(vals, fn){ 
    return fn.apply(null, vals); 
} 

и вы использовали бы выше, как так:

evaluateGeneric(['brown','fox','cholo'], function(){ 
    return `the quick ${arguments[0]} fox ${arguments[1]}`; 
}); 
0

меткой строка шаблона может помочь в этом сценарии:

function toFoo(strings, ...values) { 
    console.log(strings[0]); // string text 
    console.log(strings[1]); // string text 
    console.log(values[0]); // <your-passed-expression> 

    // TODO: Do your manipulation 
} 

const val = toFoo`string text ${expression} string text`; 

strings содержит «нормальные» знаки линии и values являются «переменной» частью. Обратите внимание, что вы должны конкатенировать строку вручную.

+0

В вашем примере 'strings' будет' ["string text", "string text"] ', не так ли? – nnnnnn

+0

О да, вы правы. Изменит его. – notion

Смежные вопросы