2012-04-11 7 views
37

UPDATE Jade v0.24.0 исправляет это с помощью синтаксиса != для атрибутов. option(value!='<%= id %>')Как заставить Jade останавливать атрибуты элементов HTML-кодировки и выдавать буквальное строковое значение?


Я пытаюсь построить <option> с нефритом, где стоимость опциона является UnderscoreJS шаблон маркера: <%= id %>, но я не могу заставить его работать, потому что нефрит преобразования мой маркер текста в &lt;= id &gt; ,

Вот мой Джейд разметки:

script(id="my-template", type="text/template") 
    select(id="type") 
    &lt;% _.each(deviceTypes, function(type){ %> 
    option(value='&lt;%= type.id %>') <%= type.name %> 
    &lt;% }) %> 

Я ожидаю, что производить этот HTML:

<script id="my-template" type="text/template"> 
    <select id='type'> 
    <% _.each(deviceTypes, function(type){ %> 
    <option value="<%= type.id %>"> <%= type.name %> </option> 
    <% }) %> 
    </select> 
</script> 

Но что я получаю вместо этого, это:

<script id="my-template" type="text/template"> 
    <select id='type'> 
    <% _.each(deviceTypes, function(type){ %> 
    <option value="&lt;%= type.id %&gt;"> <%= type.name %> </option> 
    <% }) %> 
    </select> 
</script> 

Обратите внимание на очень тонкая разница в линии вывода <option> ... атрибут tон был закодирован в HTML.

Как предотвратить Jade от HTML, кодирующего это значение? Мне нужно, чтобы оно выдавало буквальное значение, так же, как и с текстом опции.

+0

У меня недавно была такая же проблема с настройкой значений атрибутов с помощью Underscore и была найдена работа. Не супер-симпатичный, но это лучше, чем использование необработанного HTML. –

ответ

5

На данный момент я не верю, что есть способ. См. Этот вопрос: https://github.com/visionmedia/jade/issues/198

Я закончил тем, что отказался от необработанного HTML, чтобы решить эту проблему, используя | префикс.

+2

Спасибо, Кевин. Возвращение к | заставил его работать на данный момент ... жизнь на краю кровотечения ...: P –

+0

Это не должен быть принятый ответ, см. ответ Minime. – CatalinBerta

95

Derick уже упомянул, что Jade добавил новую функцию для unescape HTML-кодирования в обновлении, но я хотел бы добавить некоторое дополнение для тех, кто может не распознать.

- var html = "<script></script>" 
| !{html} <-- Escaped 
| #{html} <-- Encoded 

https://github.com/visionmedia/jade из

+1

(! && Minime) сделал мой день :) –

+1

В соответствии с http://jade-lang.com/reference/code/! {Html} is unescaped и # {html} выполняет преобразование объектов – rndstr

+0

Можем ли мы заставить это быть принятый ответ? –

33

Эта функция была added to Jade. Вы просто использовать оператор != если вы хотите экранирования в значения атрибутов:

script#my-template(type='text/template') 
    a(href!='<%= url =>') Clicky clicky... 
+0

Это работает! Тем не менее, похоже, что он не работает для атрибутов класса. – cgenco

+0

@cgenco он должен, если ваша версия jade> 1.9.2 –

+2

Я знаю - [исправил это] (https://github.com/jadejs/jade/issues/1087#issuecom-20209899);) – cgenco

0

Так у меня был вопрос, подобный этому, где я хотел, чтобы создать шаблон Underscore внутри одной из моих взглядов Джейд. Часть шаблона Underscore должна была установить атрибут selected в теге <option>.

Первоначально я пробовал иметь подменю «выбранный» или «». К сожалению, Jade doesn't have a way to display an attribute with no value и не имеет способа присвоения имен без экранирования (биты Underscore возвращались без кавычек).

К счастью, вы можете отменить значение атрибута, сохраняя кавычки.

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

- 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 

По некоторым данным, вы должны быть в состоянии использовать !{} здесь, чтобы полностью избежать все кодировки (<, >, etc.), однако это не работает на моей версии Джейд. Я использую "^0.30", а текущая версия - 1.x.

Если кто-то может подтвердить, что !{} действительно работает в этой ситуации, используя последнюю версию Jade, я обновлю свой ответ.

+0

'! {} 'не работает для меня. –

+0

'! {}' Работает в pug (новое имя нефрита) в версии 2.0.0-alpha8 –