【问题标题】:Handlebars If Statement not behaving as expectedHandlebars If 语句未按预期运行
【发布时间】:2016-04-29 22:10:49
【问题描述】:

我有以下 json 对象 -

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

我的车把模板包含以下 sn-p -

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

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

是否有人对为什么这没有按预期工作有任何想法?

注意 - 上面发布的 json 是我实际对象的精简版本。真实对象具有嵌套的 Children 数组,这些数组重用相同的对象结构。例如,在我的示例中,ChildTypeOne 也可以有一个 Childrens 数组,其中包含其他对象。

编辑**** 所以在单步执行代码时,我发现如果我的类型定义如下 -

...
"Settings" : {
   "IsChildTypeOne": 'true'
}
...

它似乎工作。删除单引号会导致在单步执行时将该值读取为未定义。

【问题讨论】:

    标签: handlebars.js handlebars.net


    【解决方案1】:

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

    {{#each Children}}
        {{#if Settings.IsChildTypeOne}}
            {{../type}}
        {{/if}}
    {{/each}}
    

    【讨论】:

    • 我认为这不是问题所在。我实际上尝试将 {{Settings.IsChildTypeOne}} 放在 if 语句之前和 if 内部,以查看在评估 if 之前和之后的值是什么 - 它似乎呈现了正确的值,但即使它呈现为 true ,它转到 else 语句。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

      这将迭代您的 Children 数组并将结果显示为

      ChildTypeOne!!! ChildTypeTwo!!!

      由于您的 json 有两个元素,一个具有 ChildTypeOne 为真,另一个不是。

      样品车把:

      <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 !!!因为第一个元素来了。

      【讨论】:

      • 这不起作用 - 我能够很好地迭代数组,但无论 IsChildTypeOne 的值如何,它总是落入 else 子句
      • {{title}}

        {{body}} {{#Children}} {{#如果 Settings.IsChildTypeOne}} ChildTypeOne!!! {{else}} ChildTypeTwo!!! {{/if}} {{/Children}}
        这段 html 代码遍历 children 数组,结果如下:

        My New Post
        这是我的第一篇文章!子类型一!!!子类型二!!!

        对于第一个元素 ChildTypeOne 来了。
      • 这很有意义,并且与我的代码相似。但是,我的实际 json 代码要复杂得多,所以我一定遇到了上下文问题。话虽如此,我无法弄清楚问题出在哪里,而且我从来没有遇到过 if 条件,它总是对 else 出错。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-11
      • 1970-01-01
      • 1970-01-01
      • 2020-11-28
      相关资源
      最近更新 更多