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