如何根据 JSON 响应类型 HandleBars 显示 Html DOM 元素

How to Display the Html DOM Elements based on JSON response type HandleBars

我正在使用车把模板,我有一个 json,其中 属性 为 "displayType",基于此我需要 show/hide dom 元素。

我在我的 DOM 中列出了需要显示的评论。所以条件不能正常工作,并且是新手。

JSON 对象:

{
  "menu": {
    "level1": [
      {
        "title": "level1 title1",
        "level2": [
          {
            "title": "level2 title 1",
            "displayType": "txtimgdesc",
            "level3": [
              {
                "title": "level3 title 1"
              }
            ]
          },
          {
            "title": "level2 title 2",
            "displayType": "img",
            "level3": [
              {
                "title": "level3 title 2"
              }
            ]
          },
          {
            "title": "level2 title 3",
            "displayType": "textimg",
            "level3": [
              {
                "title": "level3 title 3"
              }
            ]
          }
        ]
      }
    ]
  }
}

HTML 级别 3:

<ul class="nav-list list-inline container">
   {{#each ./level3}}
   <li class="list-section">
      <a href="#" class="">
         <!-- display Image only if the type is txtimgdesc or txtimg   or img  -->
         <img class="img-responsive {{showType ../displayType}}" src="">
         <!--    display header title only if the type is txtimgdesc -->    
         <span class="{{showType ../displayType}}">Header title</span>
         <!--    display title only if the type is txtimgdesc or txtimg -->    
         <span class="{{showType ../displayType}}">{{{title}}}</span>
      </a>
   </li>
   {{/each}}
</ul>  

注册助手:

Handlebars.registerHelper('showType', function(dType){
   var _ckType = (dType) ? dType.toLowerCase(): "", returnType="";  
   returnType = (_ckType == "img") ? "" : "hidden";
   returnType = (_ckType == "txtimgdesc") ? "" : "hidden";
   returnType = (_ckType == "txtimg") ? "" : "hidden";
   return returnType;  
});

我认为最好的方法是在数据到达模板之前对其进行操作。例如,每个 "level3" 数组中的每个对象都可以添加以下属性:showImageshowTitleshowDescription。这样,用于确定显示内容和隐藏内容的混乱逻辑可以保留在您的代码中,您的模板可以保持干净简单,只需一些直接的 if 逻辑。

但是,为了练习,我得出了一个使用 Handlebars helper 方法的解决方案。

如果我们当前上下文 ../displayType 不属于 某些显示类型组,则任务是向元素添加 class。

在我看来,这与 {{#if }} 助手非常相似,只是我们要传递一个值和一个列表。如果该值在列表中,帮助器将评估为 true。如果列表中的值为 not,则助手将计算为 false 并且 {{else}} 块将呈现。我已将我的帮手命名为 contains:

Handlebars.registerHelper('contains', function (options) {
    var list = (options.hash.list ? options.hash.list.split(',') : []);
    var value = (options.hash.value || '');

    if (list.indexOf(value) > -1) {
        return options.fn(this);
    }
    else {
        return options.inverse(this);
    }
});

请注意,我无法将数组作为 hash arguments 的一部分传递,因此我传递的是逗号分隔的字符串,助手的工作是将其拆分为数组。

现在,为了让您的模板使用我的助手,它必须进行如下修改:

<!-- display Image only if the type is txtimgdesc or txtimg   or img  -->
<img class="img-responsive {{#contains value=../displayType list="txtimgdesc,txtimg"}}{{else}}hidden{{/contains}}" src="">

<!--    display header title only if the type is txtimgdesc -->    
<span class="{{#contains value=../displayType list="txtimgdesc" }}{{else}}hidden{{/contains}}">Header title</span>

<!-- display title only if the type is txtimgdesc or txtimg --> 
<span class="{{#contains value=../displayType list="txtimgdesc,txtimg" }}{{else}}hidden{{/contains}}">{{title}}</span>

我喜欢这种方法的一点是,当列表中 ../displayType 时,它可以很容易地应用 class .