我是Handlebars的新手,使用的版本是4.1.2。我正在尝试将一些用PHP编写的模板转换为Handlebars。
我的数据源是JSON格式的数据流,结构如下:
[
{
"regulations_label": "Europe",
"groups_label": "Group 1",
"filters_label: "FF1A"
},
{
"regulations_label": "Europe",
"groups_label": "Group 1",
"filters_label: "FF1B"
},
{
"regulations_label": "Europe",
"groups_label": "Group 2",
"filters_label: "FF2A"
},
{
"regulations_label": "Asia",
"groups_label": "Group 999",
"filters_label: "FF999A"
},
{
"regulations_label": "Asia",
"groups_label": "Group 999",
"filters_label: "FF999B"
},
{
"regulations_label": "Americas",
"groups_label": "Group 10000",
"filters_label: "FF10000A"
},
]
我的HTML模板的输出结果(PHP版本)如下:
- 欧洲
- 第1组
- FF1A
- FF1B
- 第2组
- FF2A
- 第1组
- 亚洲
- 第999组
- FF999A
- FF999B
- 第999组
- 美洲
- 第10000组
- FF10000A
- 第10000组
在不重复输出 regulations_label
或 groups_label
的情况下,实现这一点的方法是使用条件逻辑来检查前一个数组值是否已更改,例如:
// $data is the JSON above.
foreach ($data as $key => $d):
if ($data[$key-1]['groups_label'] !== $d['groups_label'])
echo $d['groups_label'];
endif;
endforeach;
以上代码意味着,
groups_label
只有在它与前一个值不同时才会被渲染,例如"Group 1"只会输出一次,以此类推。所以在Handlebars中,我希望应用相同的原则。我已经阅读了 Handlebars/Mustache - Is there a built in way to loop through the properties of an object? ,并理解了有
{{@index}}
和 {{@key}}
。
但我的问题是我无法对它们应用条件逻辑。例如不存在 {{@index - 1}}
我设置的方式如下:<script id="regulations-template" type="text/x-handlebars-template"></script>
<script type="text/javascript">
var regsInfo = $('#regulations-template').html();
var template = Handlebars.compile(regsInfo);
var regsData = template({ myregs: // JSON data shown above });
$('#output').html(regsData);
</script>
<div id="output"></div>
内容呈现在
#output
div中,但每个级别都重复,例如:- Europe
-- Group 1
---- FF1A
- Europe
-- Group 1
---- FF1B
这个问题只是因为我找不到一种方法来查看前一个数组值并进行条件逻辑而发生。我该如何解决这个问题?
赏金注意事项:
我正在寻找使用Handlebars的解决方案,并利用它提供的任何可帮助解决此问题的功能。有人评论说可以在普通的js/jquery中做到这种事情。我们想要使用Handlebars来利用其模板,因此需要完全使用它的解决方案才能获得赏金。这种条件逻辑是许多其他模板系统(不仅限于PHP)的微不足道的部分。因此,我不禁想到在Handlebars中有一种方法,因为模板是主要用例。
#output
。但Handlebars、Mustache等工具的一个目的是,让你可以将模板语法编写为HTML(请参见问题中#regulations-template
的内部),从而获得更多的灵活性。 - Andy