在"mu is too short"的建议和我自己的一些疯狂想法的帮助下,我想出了一种有趣的复杂模板解决方案。*它几乎可以工作!
假设我有这个要放入模板中的内容(或数据或视图):
var content = {
title: "Black Book",
girls: ["blonde", "brunette", "redhead"],
digits: ['123', '456', '789'],
calc: function () {
return 2 + 4;
}
};
我有一个类似这样的模板:
<script type="text/template" id="template">
<h1>{{title}}</h1>
<h3>{{calc}}</h3>
<ul>
<li><a href="{{digits}}">{{hair}}</a></li>
</ul>
</script>
我想要的最终结果是这样的:
<h1>Black Book</h1>
<h3>6</h3>
<ul>
<li><a href="123">blonde</a></li>
<li><a href="456">brunette</a></li>
<li><a href="789">redhead</a></li>
</ul>
我们将遇到的问题是原始内容中嵌套了数组(或列表),如果我们尝试使用Mustache.render(html, content)渲染,我们最终只会得到一个li项或一个完整的数组在一个href=""属性内。太遗憾了...
所以这里的方法是多次通过模板。第一次,通过并替换顶级项,并调整下一次通过的模板。第二次,调整其中一个列表,并调整第三次通过的模板,等等,直到您拥有的内容层数。这是新的起始模板:
<script type="text/template" id="template">
<h1>{{title}}</h1>
<h3>{{calc}}</h3>
<ul>
{{#hair}}
{{#digits}}
<li><a href="{{digits}}">{{hair}}</a></li>
{{/digits}}
{{/hair}}
</ul>
</script>
第一次遍历时,填写顶级内容,并将{{digits}}更改为{{.}}
$.each(content, function (index, value) {
template2 = template.replace(/{{title}}/ig, content.title)
.replace(/{{calc}}/ig, content.calc)
.replace(/{{digits}}/ig, '{{.}}');
});
现在你有这个:
<h1>Black Book</h1>
<h3>6</h3>
<ul>
{{#hair}}
{{#digits}}
<li><a href="{{.}}">{{hair}}</a></li>
{{/digits}}
{{/hair}}
</ul>
在下一次通过时,我们只需调用 Mustache.render(template2, content.digits); ,这样就可以得到以下结果:
<h1>Black Book</h1>
<h3>6</h3>
<ul>
{{#hair}}
<li><a href="123">{{hair}}</a></li>
<li><a href="456">{{hair}}</a></li>
<li><a href="789">{{hair}}</a></li>
{{/hair}}
</ul>
我的逻辑到这里就停滞了,哈哈。如果有帮助思考的话,那就太好了!我想我可以去掉{{hair}}块元素,只需通过content.girls进行$.each遍历并堆叠.replace三次。或者我可以尝试从最低级别的内容开始,逐步向上工作。我不知道。
所有这些基本上让我想知道是否有一种“无逻辑”的方式来处理这种嵌套或多次遍历,以便在mustache中处理它吗?