UPDATEJade v0.24.0 corrige cela avec une syntaxe !=
pour les attributs. option(value!='<%= id %>')
J'essaie de créer un <option>
avec jade, où la valeur de l'option est un marqueur de modèle UnderscoreJS: <%= id %>
, mais je ne parviens pas à le faire fonctionner car jade convertit le texte de mon marqueur en <= id >
.
Voici mon balisage Jade:
script(id="my-template", type="text/template")
select(id="type")
<% _.each(deviceTypes, function(type){ %>
option(value='<%= type.id %>') <%= type.name %>
<% }) %>
Je m'attends à ce qu'il produise ce code HTML:
<script id="my-template" type="text/template">
<select id='type'>
<% _.each(deviceTypes, function(type){ %>
<option value="<%= type.id %>"> <%= type.name %> </option>
<% }) %>
</select>
</script>
Mais ce que je reçois à la place, c'est ceci:
<script id="my-template" type="text/template">
<select id='type'>
<% _.each(deviceTypes, function(type){ %>
<option value="<%= type.id %>"> <%= type.name %> </option>
<% }) %>
</select>
</script>
Notez la différence très subtile dans la ligne <option>
de la sortie ... l'attribut value
de l'option a été codé en HTML.
Comment empêcher Jade d'encoder HTML avec cette valeur? J'en ai besoin pour produire la valeur littérale, de la même manière que pour le texte de l'option.
Au moment d'écrire ces lignes, je ne crois pas qu'il y ait un moyen d'y arriver. Voir ce numéro: https://github.com/visionmedia/jade/issues/198
J'ai fini par passer en HTML brut pour le résoudre, en utilisant le | préfixe.
Derick a déjà mentionné que Jade avait ajouté une nouvelle fonctionnalité pour l'encodage HTML sans détour dans la mise à jour, mais j'aimerais ajouter un addenda pour quelqu'un qui pourrait ne pas le reconnaître.
- var html = "<script></script>"
| !{html} <-- Escaped
| #{html} <-- Encoded
Cette fonctionnalité a été ajouté à Jade . Vous utilisez simplement l'opérateur !=
si vous souhaitez dissocier les valeurs d'attribut:
script#my-template(type='text/template')
a(href!='<%= url =>') Clicky clicky...
J'avais donc un problème similaire à celui-ci, où je voulais créer un modèle Underscore dans l'une de mes vues Jade. Une partie du gabarit de soulignement nécessaire pour définir l'attribut selected
dans une balise <option>
.
Au départ, j'ai essayé de faire revenir Underscore "sélectionné" ou "". Malheureusement, Jade ne dispose pas d'un moyen d'afficher un attribut sans valeur et d'un moyen de ne pas laisser de noms d'attributs (les bits Underscore revenaient sans guillemets).
Heureusement, vous pouvez décaper le value d'un attribut, en préservant les guillemets.
Dans cet exemple, je sélectionne une valeur d'une liste déroulante en fonction du type de propriétaire correspondant à une valeur de chaîne. J'ai défini une fonction d'assistance pour ne pas avoir à échapper manuellement des guillemets.
- var checkType = function(type) { return "<%= contact.type == '" + type + "' %>" };
.clearfix
label Title:
.input
select(type="text", name="contact[title]", class="new-title")
option(value="") Choose Title
option(value="manager", selected="#{ checkType('manager') }") Manager
option(value="member", selected="#{ checkType('member') }") Member
option(value="owner", selected="#{ checkType('owner') }") Owner
option(value="president", selected="#{ checkType('president') }") President
option(value="individual", selected="#{ checkType('individual') }") Individual
option(value="main_contact", selected="#{ checkType('main_contact') }") Main Contact
Selon certains, vous devriez pouvoir utiliser !{}
ici pour éviter complètement tout encodage (<, >, etc.
), mais cela ne fonctionnait pas sur ma version de Jade. J'utilise "^0.30"
et la version actuelle est 1.x
.
Si quelqu'un peut vérifier que !{}
fonctionne dans cette situation avec la dernière version de Jade, je mettrai à jour ma réponse.