Handlebars如果Statement没有按预期运行

时间:2016-04-22 18:31:32

标签: handlebars.js handlebars.net

我有以下json对象 -

{ 
    "type": "typeOne", 
    "Children": [
          {
             "ChildType": "ChildTypeOne",
             "Settings": {
                  "IsChildTypeOne": true
              }
           },
           {
               "ChildType": "ChildTypeTwo",
               "Settings": {
                    "IsChildTypeTwo": true
                }
           }
     ] 
}

我的手柄模板包含以下代码段 -

{{#each Children}}
    {{#if Settings.IsChildTypeOne}}
        ChildTypeOne!!
    {{else}}
        ChildTypeTwo!!
    {{/if}}
{{/each}}

如果我通过模板运行此数据,那么唯一呈现的是ChildTypeTwo !!。所以似乎if语句没有正确评估IsChildTypeOne。奇怪的是,如果我在else子句中显示一个语句来显示IsChildTypeOne的值,则第一个ChildType的值显示为true。

有没有人想过为什么这不能按预期工作?

注意 - 上面张贴的json是我实际物体的精简版。真实对象具有嵌套的Children数组,它们重用相同的对象结构。例如,在我的例子中,ChildTypeOne也可以有一个包含其他对象的Childrens数组。

EDIT **** 因此,在逐步执行代码时,我发现如果我的类型定义如下 -

...
"Settings" : {
   "IsChildTypeOne": 'true'
}
...
它似乎工作。删除单引号会导致在单步执行时将值读取为未定义。

3 个答案:

答案 0 :(得分:1)

这最终与用于将json字符串序列化为对象的进程相关。有关解释,请参阅问题here

答案 1 :(得分:0)

您可以尝试更改车把模板代码,如下所示:

 {{#Children}}
       {{#if Settings.IsChildTypeOne}}
          ChildTypeOne!!!
       {{else}}
          ChildTypeTwo!!!
       {{/if}}
{{/Children}}

这将迭代你的孩子数组,并以

给你结果

ChildTypeOne !!! ChildTypeTwo !!!

因为你的json有两个元素,其中ChildTypeOne为true而另一个没有。

示例handelbar:

<div class="entry">
  <h1>{{title}}</h1>
  <div class="body">
    {{body}}
    {{#Children}}
       {{#if Settings.IsChildTypeOne}}
          ChildTypeOne!!!
       {{else}}
          ChildTypeTwo!!!
       {{/if}}
{{/Children}}
  </div>
</div>

以上模板的html输出:

<div class="entry">
  <h1>My New Post</h1>
  <div class="body">
    This is my first post!
          ChildTypeOne!!!
          ChildTypeTwo!!!
  </div>
</div>

你可以看到ChildTypeOne !!!因为第一个元素即将到来。

答案 2 :(得分:0)

鉴于charrs的回答似乎没有帮助,而且你的JSON比你发布的更复杂,也许你的实际模板没有正确引用父上下文?例如,如果您想访问#each children block中的type字段,它将如下所示:

<button onclick='add()'>
  add
</button>
<table>
  <tr>
    <th>content</th>
    <th>delete</th>
  </tr>
  <tbody>
    <tr>
      <td>Something</td>
      <td>
        <button onclick='rm()'>
          remove
        </button>
      </td>
    </tr>
  </tbody>
</table>