Выражения не должны использовать экранирование:
- if (episode[question.name][field])
foo
(Очевидно, при правильной настройке переменной).
Изменить, чтобы ответить на комментарий
Вы не проверяете, существует ли элемент первым, прежде чем пытаться прочитать поле, как в отображении даты, так и в элементе ввода ... Хотя ваш сценарий использования немного непрозрачен, вам нужно проверить наличие элемента первый:
- if (episode[question.name] && episode[question.name][field])",
Я думаю, вы пытаетесь показать элемент ввода для вещей без значений и отобразить его иначе - не совсем уверен. Вы можете захотеть что-то более близкое к этому (без знания того, что вы делаете, я создал поддельный шаблон с тем, что, по-моему, отражает ваши данные - я прокомментировал значение "2-PT"
для проверки). Небольшой рефакторинг, чтобы привести вещи в порядок, но не сильно.
var s = [
"ol#questions",
" each question in questions",
" li",
" ul.question",
" li: h3 (#{question.name}) #{question.description}",
" if question.fields",
" each field, i in question.fields",
" - var foo = field === 'Date' ? 'date' : ''",
" p(class='#{foo}')",
" if episode[question.name]",
" - var field_value = episode[question.name][field] || '' ",
" if field_value",
" #{field_value}",
" else",
" input(name='episode[#{question.name}][#{field}]', class='', value='#{field_value}')",
""
].join("\n");
var locals = {
"question": {
"name": "M00104"
},
"episode": {
"M00104": {
// "2-PT": "on",
"Date": "2012-01-02"
}
},
"questions": [
{
"name": "M00104",
"description": "Do we have it?",
"fields": ["Date", "2-PT"]
},
]
}
var jade = require('jade');
var fn = jade.compile(s);
console.log(fn(locals));
После уборки:
<ol id="questions">
<li>
<ul class="question">
<li>
<h3>(M00104) Do we have it?</h3>
</li>
<li style="list-style: none; display: inline">
<p class="date">2012-01-02</p>
<p class="">on</p>
</li>
</ul>
</li>
</ol>
С закомментированной строкой "2-PT"
:
<p class=""><input name="episode[M00104][2-PT]" value="" class=""></p>