проверка наличия поля в нефрите - PullRequest
2 голосов
/ 06 января 2012

Рассмотрим этот фрагмент Jade:

if(#{episode[question.name][field]})
   #{episode[question.name][field]}

Я хочу проверить, существует ли значение episode[question.name][field]. Если это так, выведите значение в следующей строке.

500 SyntaxError: Неожиданный токен ILLEGAL

Здесь указан текущий источник и дополнительная информация.

h1= title

p Добро пожаловать в # {title}

ol#questions
    each question in questions
        li  
            ul#question
                li: h3  (#{question.name})  #{question.description}
                - if(question.options)
                    ul#options
                        for option, i in question.options
                            if(typeof(option) === "object")
                                li: h3  #{i}
                                ul#option
                                        each soption in option
                                            li
                                                input(type='checkbox',  name='episode[#{question.name}][#{soption}]',   checked='#{episode[question.name][soption]}')
                                                //
                                                label
                                                    #{soption}  
                            else
                                li
                                    input(type='checkbox',  name='episode[#{question.name}][#{option}]',    checked='#{episode[question.name][option]}')
                                    //
                                    label
                                        #{option}
                if(typeof(question.fields) !== 'undefined')
                    for field, i in question.fields
                        if(field === "Date")
                            p.date
                                if(#{episode[question.name][field]} !== "undefined")                    
                                    #{episode[question.name][field]}
                        else
                            p                       
                                input(name='episode[#{question.name}][#{field}]', class='', value="#{episode[question.name][field]}")

и вот объект данных, переданный в

 episode =   {
  "form": {
    "formid": "4efd9c4cae999dcf0a12c461",
    "name": "ROC"
  },
  "patientid": ObjectId("4ef6835a7a5869082a80bc95"),
  "certperiodid": ObjectId("4f020ff0850b21bc2b000001"),
  "M0080": {
    "2-PT": "on",
    "3-SLP\/ST": "on",
    "4-OT": "on"
  },
  "M0090": {
    "Date": "2012-01-02"
  },
  "M0100": {
    "1 - Start of care--further visits planned": "on",
    "3 - Resumption of care (after inpatient stay)": "on"
  },
  "M00104": {
    "Date": "2012-05-02"
  },
  "_id": ObjectId("4f071a0424ddf0dd66000003")
}

Как это можно исправить и написать правильно?

так, например, если одно из полей даты пустое (не заполнено), чтобы предотвратить ошибку, мне нужно проверить, если оно не пустое, перед выводом значения.

еще раз спасибо заранее

1 Ответ

2 голосов
/ 06 января 2012

Выражения не должны использовать экранирование:

- 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>
...