javascript - 如何使用 Handlebars 生成网格
问题描述
我需要使用 Handlebars 生成一个网格(10 行和 10 列)。我创建了这样的模板:
<script id="battlefield-tmpl" type="x-handlebars-template">
{{#each rows}}
<div class="battlefield__row">
{{#each this}}
<div class="battlefield__cell" data-row="{{this.row}}" data-col="{{this.col}}"></div>
{{/each}}
</div>
{{/each}}
</script>
然后,这是一个脚本部分:
const battleFieldTemplate = getTemplate('battlefield-tmpl');
const temp = battleFieldTemplate({
rows: [
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
]
}
);
document.querySelector('#battlefield').innerHTML += temp;
function getTemplate(templateId) {
const templateString = document.getElementById(templateId).innerHTML;
return Handlebars.compile(templateString);
但是现在我需要创建一个模板,其中每个单元格都将包含行和列索引(不是数字 1、2、3 .....10)。它应该是自动生成的。我需要收到这个:
const temp = battleFieldTemplate({
rows: [
[{row: 0, col: 0}, {row: 0, col: 1}, {row: 0, col: 2} and so on],
但不是手动编写每个索引。怎么做?
解决方案
首先,渲染您的原始数据。确保您的原始模板有效。
const getTemplate = (sel) => Handlebars.compile(document.querySelector(sel).innerHTML);
const battleFieldTemplate = getTemplate('#battlefield-tmpl');
const temp = battleFieldTemplate({
rows: [
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
]
}
);
document.querySelector('#battlefield').innerHTML = temp;
body {
padding: 1em;
}
.battlefield__row {
display: block;
margin: 0;
padding: 0;
margin-bottom: 0.25em;
}
.battlefield__cell {
display: inline-block;
width: 1.25em;
height: 1.25em;
line-height: 1.25em;
border: thin solid grey;
margin: 0;
padding: 0;
text-align: center;
}
<link href="https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.1/normalize.min.css" rel="stylesheet"/>
<script src="https://cdnjs.cloudflare.com/ajax/libs/handlebars.js/4.7.3/handlebars.min.js"></script>
<div id="battlefield"></div>
<script id="battlefield-tmpl" type="x-handlebars-template">
{{#each rows}}
<div class="battlefield__row">
{{#each this}}
<div class="battlefield__cell">{{.}}</div>
{{/each}}
</div>
{{/each}}
</script>
然后,您可以更改您的数据结构并稍微更改模板......您需要在{{row}}
没有该this.
部分的情况下访问。
const getTemplate = (sel) => Handlebars.compile(document.querySelector(sel).innerHTML);
const battleFieldTemplate = getTemplate('#battlefield-tmpl');
const temp = battleFieldTemplate({
rows: [
[ {row: 0, col: 0}, {row: 0, col: 1}, {row: 0, col: 2} ],
[ {row: 1, col: 0}, {row: 1, col: 1}, {row: 1, col: 2} ],
[ {row: 2, col: 0}, {row: 2, col: 1}, {row: 2, col: 2} ]
]
}
);
document.querySelector('#battlefield').innerHTML = temp;
body {
padding: 1em;
}
.battlefield__row {
display: block;
margin: 0;
padding: 0;
margin-bottom: 0.25em;
}
.battlefield__cell {
display: inline-block;
width: 2em;
height: 2em;
line-height: 2em;
border: thin solid grey;
margin: 0;
padding: 0;
text-align: center;
}
<link href="https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.1/normalize.min.css" rel="stylesheet"/>
<script src="https://cdnjs.cloudflare.com/ajax/libs/handlebars.js/4.7.3/handlebars.min.js"></script>
<div id="battlefield"></div>
<script id="battlefield-tmpl" type="x-handlebars-template">
{{#each rows}}
<div class="battlefield__row">
{{#each this}}
<div class="battlefield__cell" data-row="{{row}}" data-col="{{col}}">{{row}}×{{col}}</div>
{{/each}}
</div>
{{/each}}
</script>
推荐阅读
- php - 语法错误:意外的令牌 <
- typescript - 带有部分类型注释的 TypeScript 函数参数解构
- jupyter-notebook - IBM Watson Studio 中 Jupyter Notebook 中的超链接 - 拒绝连接
- vuepress - 在布局中包含自定义手写笔文件(Vuepress 1.x)
- java - java - 如何在java中只使用某些类对象值?
- jquery - 通过 jquery 的后台 css 更新没有发生
- javascript - 如何使用 queryselector 来验证是否填写了两个输入字段?
- python - 如何使用熊猫将 logReturns 转移回原始价格?
- c# - 用新值更新列中的每条记录
- wordpress - 网站问题 - 从本地主机移动到虚拟机