2016-10-11 12 views
1

は、私はそうのような文字通りのテンプレートを持っていると言います。評価テンプレートリテラルは、動的に

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 evaluateGeneric(vals, fn){ 
    return fn.apply(null, vals); 
} 

を、あなたは上記のようにのように使用します:あなたは手の込んだ取得したい場合

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

今、あなたはこれを作成することができます機能を置き換える一般的なように聞こえるの

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

あなたの例では、 'string'は' ["string text"、 "string text"] 'でしょうか? – nnnnnn

+0

ああ、そうだよ。それを変更します。 – notion