【问题标题】:checking whether a field exists in Jade检查 Jade 中是否存在字段
【发布时间】:2012-01-06 17:20:28
【问题描述】:

考虑一下 Jade 的这个 sn-p:

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

我想检查episode[question.name][field] 的值是否存在。如果是,则在下一行输出该值。

500 SyntaxError: Unexpected token 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")
}

如何才能正确修复和编写?

例如,如果其中一个日期字段为空(未填写),为了防止出错,我需要在输出值之前检查它是否不为空。

再次提前感谢

【问题讨论】:

  • 您的实际代码是否在if 前面有-
  • 不,但我现在就试试。
  • (另外,您在问题列表中为多个 DOM 元素提供了相同的 id (questions);这是无效的 HTML——请考虑改用类。)

标签: javascript pug


【解决方案1】:

表达式不应使用转义:

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

【讨论】:

  • 好吧,您看到的问题是例如“question.name”生成的值,是用于从剧集对象获取值的名称。我不知道我解释的对不对。 “question.name”原样,(是问题对象的属性)。 question.name 的值是我用来指代我想要从 episodes 对象中获得的值。
  • @mojotaker 对;我明白那个。表达式应该只是原始的 JavaScript 表达式。如果你传入question,我展示的语法就是你应该使用的。 (还有field。)
  • 当您引用表达式之外的值时,您需要#{}
  • 谢谢。使用您的建议,我不再收到任何语法错误。谢谢你。但是 if 语句的目的是防止日期字段之一为空时出错。我收到“无法读取未定义的属性‘日期’”错误。
  • @mojotaker 那么你的逻辑和/或数据不正确; question 是什么样的?你从哪里得到它?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-09
  • 1970-01-01
相关资源
最近更新 更多