Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/css/40.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Handlebars.js 把手能否在循环中访问唯一的对象名称?_Handlebars.js - Fatal编程技术网

Handlebars.js 把手能否在循环中访问唯一的对象名称?

Handlebars.js 把手能否在循环中访问唯一的对象名称?,handlebars.js,Handlebars.js,我将一个第三方对象返回给Handlebar,但我注意到一些属性名称的前缀是唯一的名称空间。这里有一个简短的摘录: var data={ "soapenv:Envelope":{ "soapenv:Body":{ "CaseDetails":[ { "Status":"Open", "Opened":"2018-02-19T10:56:03.783Z",

我将一个第三方对象返回给Handlebar,但我注意到一些属性名称的前缀是唯一的名称空间。这里有一个简短的摘录:

var data={
    "soapenv:Envelope":{

      "soapenv:Body":{

           "CaseDetails":[
            {
             "Status":"Open",
             "Opened":"2018-02-19T10:56:03.783Z",
             "ns1:CaseReference": {"id":"111111"}
            },
            {
             "Status":"Closed",
             "Opened":"2017-02-19T10:56:03.783Z",
             "ns3:CaseReference": {"id":"222222"}
            },
            {
             "Status":"Closed",
             "Opened":"2016-02-19T10:56:03.783Z",
             "ns8:CaseReference": {"id":"3333"}
            }
            ]
      }

    }
};
我想循环遍历这个对象并输出信息。是否可以匹配以下唯一名称:ns1:CaseReference、ns3:CaseReference和ns8:CaseReference

{{#each data.soapenv:Envelope.soapenv:Body.CaseDetails}} 

<td>{{Status}}</td>
<td>{{Opened}}</td>
<td>{{???.id}}</td>

{{/each}} 
{{{#每个数据.soapenv:Envelope.soapenv:Body.CaseDetails}
{{Status}}
{{Opened}}
{{???.id}
{{/每个}}

我根据这篇文章设法得到了它:

})

使用“this”遍历树的把手:

<ul>
{{#each soapenv:Envelope}}
    {{#each this}}
        {{#each this}}
            <li>
            {{this.Status}}
            {{#each this}}            
                {{this.id}}
            {{/each}}
            {{this.Opened}}
            </li>
        {{/each}}
    {{/each}}
{{/each}}
</ul>
    {{{#每个soapenv:Envelope} {{{#每个这个} {{{#每个这个}
  • {{this.Status}} {{{#每个这个} {{this.id}} {{/每个}} {{this.Opened}
  • {{/每个}} {{/每个}} {{/每个}}

您可以编写一个自定义的HandlebarsHelper,
ifKeyHasText
来检查键是否包含特定的字符串(本场景中的CaseReference)

在模板中,您可以将字符串
caseference
与数据JSON一起作为
对象传递给助手
{{{ifKeyHasText}}

{{#each soapenv:Envelope.soapenv:Body.CaseDetails}} 
  <td>{{Status}}</td>
  <td>{{Opened}}</td>
  <td>
    {{#ifKeyHasText this 'CaseReference'}}
      {{id}}
    {{/ifKeyHasText}}
  </td>
{{/each}}
{{#每个soapenv:Envelope.soapenv:Body.CaseDetails}
{{Status}}
{{Opened}}
{{{#IfkeyHaste在此“案例参考”后面}
{{id}
{{/ifKeyHasText}
{{/每个}}

希望这能有所帮助。

这不是最佳解决方案。如果有一个同级对象的子
id
指向任何“案例引用”,则两个id都将被打印。例如,请参见此JSON结构<代码>“状态”:“打开”,“打开”:“2018-02-19T10:56:03.783Z”,“ns1:CaseReference”:{“id”:“111111”},“虚拟”:{“id”:“xxxxx”}。这里,
dummy
ns1:caseference
的同级对象,它作为子对象也具有
id
。在这种情况下,将同时打印ID
111111
xxxxx
。请在下面找到我关于如何使用定制车把助手解决此问题的答案。您好@GibinEalias,您的观点很好!幸运的是,数据源不会改变,所以我不必担心这种情况,但我很高兴您让我意识到了这一点。很乐意帮助:)
Handlebars.registerHelper('ifKeyHasText', function(array, value, options) {

  var key;

  if(Object.keys(array).some(function(k){
    if(~k.indexOf(value)){
      key = k;
    }
  }));

  if(key){
    return options.fn(this[key]);
  }

});
{{#each soapenv:Envelope.soapenv:Body.CaseDetails}} 
  <td>{{Status}}</td>
  <td>{{Opened}}</td>
  <td>
    {{#ifKeyHasText this 'CaseReference'}}
      {{id}}
    {{/ifKeyHasText}}
  </td>
{{/each}}