2017-01-26 3 views
1

J'utilise moustache pour construire une seule chaîne, en remplaçant plusieurs variables en son sein. J'aimerais utiliser un TemplateString à la place, mais j'ai besoin de résoudre ma chaîne au moment de l'exécution, et pas au moment de la compilation du code puisque je lis la chaîne du modèle à partir d'une source externe.Javascript ES6 TemplateString un TemplateString

Pour être clair:

// mustachy example 
// template is "foo{{who}}" and myData.whmustao = "manchu" 
let myResult = mustache.render(getMyTemplate(),myData); 
console.log(myResult); // "foomanchu" 

C'est assez léger, et j'aimerais utiliser un TemplateString, mais comme l'exemple ci-dessous aludes à - je ne peux pas imaginer un moyen de fournir à l'extérieur de la chaîne dans la première place ...

// ES6xy example 
let myResult = `foo${myData.who}`; // can't get this at runtime 
console.log(myResult); // "foomanchu" 

Mais, je ne peux pas imaginer une manière simple, propre et sournoise d'y parvenir. Peut tu?

Répondre

0

Merci pour vos réponses et solutions créatives. Cependant, je pensais qu'il n'y avait pas de solution parce que TemplateStrings est une fonctionnalité intégrée au code, alors que d'autres solutions de modèle (comme moustache) sont une fonctionnalité axée sur les données. En d'autres termes, les chaînes de modèles de ES6 sont une fonctionnalité de langage qui limite sa fonctionnalité aux chaînes de code statiques. Toutes les autres flexibilités imaginées doivent s'appuyer sur l'exécution dynamique d'un code que vous injectez dans votre application, ce qui est le rêve de tout pirate.

Donc la réponse à ma pensée originale, à savoir si Moustache est exagérée pour une chaîne simple qui n'est pas codée en dur dans votre source - est NON. Moustache est la solution acceptable pour ce scénario.

0

Je suppose que vous chargez des données sur le client et souhaitez générer une chaîne basée sur les données renvoyées. Vous pourriez avoir une fonction disponible qui retourne la chaîne générée pour vous

function generateString(val1, val2) { 
    return `foo${val1} bar${val2}; 
} 

pouvez-vous appeler cette fonction sur le client à la suite d'un appel api qui obtient val1 et val2?

cette stratégie fonctionne également sur le serveur si vous retarder votre réponse jusqu'à ce que vous avez toutes les données dont vous avez besoin

+0

Mais le format de la chaîne de modèle elle-même n'est pas connu dans le code, il est fourni par un environnement externe. C'est un modèle basé sur la configuration et ne peut pas exister dans le code de 'quotes '. –

+0

Dans quel format se trouve la chaîne du modèle? si c'est un modèle de moustache, alors vous essayez en fait de réécrire la fonction Moustache.render, à quel point, vous pouvez aussi bien ne pas utiliser Moustache – Jon

0

mettre le modèle-chaîne en fonction, et passer myData

let renderMyTemplate = data => `foo${data.who}`; 
//or 
let renderMyTemplate = ({who}) => `foo${who}`; 


let myResult = renderMyTemplate(myData); 
console.log(myResult); 
+0

Mais le format de la chaîne de template n'est pas connu dans le code, il est fourni par un environnement externe. C'est un modèle basé sur la configuration et ne peut pas exister dans le code de 'quotes '. –

+0

@InquisitorShm, votre backend doit alors renvoyer Javascript et non du texte/des données; Les chaînes de modèles sont du code et non des données! Vous pouvez jeter un oeil à JSONP, et utiliser quelque chose comme 'jsonpCallbackName ({myTemplate: function (données) {return \' toto $ {data.who} \ '}, myTemplate2: ...})' ou simplement 'jsonpCallbackName (data => \ 'foo $ {data.who} \') 'pour un seul template – Thomas