Comment puis-je brancher une stratégie pour gérer les attributs manquants lors de l'utilisation de modèles de moustache

StackOverflow https://stackoverflow.com/questions/8978779

  •  12-11-2019
  •  | 
  •  

Question

J'utilise Mustache pour rendre des trucs sur le serveur, mais aussi sur le client. La stratégie est que j'ai une application de page unique (rendue avec Moustache sur le serveur) et ce modèle tire des extraits du serveur et les utilise pour rendre JSON sur le client également.

Maintenant, le problème est avec les modèles. Je veux rendre les étiquettes sur le serveur, mais laisser une syntaxe de moustache en place pour être rendue sur le client. Disons que j'ai un modèle comme ceci:

<html>
<head><title>{{label.title}}</title></head>
<body>
    <h1>{{name}}</h1>
    <p>{{description}}</p>
</body>
</html>

Le rendu côté serveur remplira l'étiquette, mais maintenant il supprime également les espaces réservés qui ne sont pas visibles sur le contexte.

<html>
<head><title>Ze zjerman title</title></head>
<body>
    <h1></h1>
    <p></p>
</body>
</html>

Existe-t-il un moyen de se connecter à l'échelle et d'éviter cela? J'ai naïvement essayé de m'en tirer:

templateEngine.layout(path, Map(attributes:_*).withDefault((key)=>"{{"+key+"}}"))

... Mais évidemment, cela sera jeté dès que la carte sera traitée via une boucle (par exemple dans la ligne de modèle de modèle 576). Où est le point de fiche approprié pour cela?

J'ai aussi trouvé le non-fonte et le nullstring RenderContext, mais je pense que je ne peux pas faire de la sortie du rendu une clé là-bas, car ces variables ne sont que des chaînes ...

J'utilise Scalatra-Scalate 2.0.2 et Scala 2.9.0-1.

Était-ce utile?

La solution

Vous pouvez utiliser un autre délimiteur pour les données que vous connaissez sera le côté client peuplé. Voir: Définir le délimiter

Modèle côté serveur:

<h1>{{title}}</h1>
<p> [[ client.name ]] - [[ client.description ]] </p>

Données côté serveur:

{title : "Hello"}

Présentez votre autre délimiteur au modèle de serveur rendu, puis rendez le côté client.

var client_template = "{{=[[ ]]=}}" + server_rendered,
client_data = { client : { name : "Max", description : "world"}},
client_rendered = Mustache.render(client_template, client_data);

J'ai fait un jsfiddle qui fonctionne pour le montrer. Consultez la console.log pour voir le modèle de serveur avant et après.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top