在小胡子模板中有没有拖尾逗号表示逗号分隔列表的优雅方式?
我正在使用小胡子模板库,并尝试生成一个逗号分隔列表,没有尾随逗号,例如
红色,绿色,蓝色
考虑到结构,使用尾随逗号创build列表是非常简单的
{ "items": [ {"name": "red"}, {"name": "green"}, {"name": "blue"} ] }
和模板
{{#items}}{{name}}, {{/items}}
这将解决
红色,绿色,蓝色,
然而,我看不到一个优雅的expression方式,没有尾随的逗号。 在将代码传递给模板之前,我始终可以在代码中生成列表,但是我想知道该库是否提供了一种替代方法,例如允许您检测它是否是模板中列表中的最后一项。
Hrm,值得怀疑的是, 胡子演示很显示了你的first
属性,你必须拥有JSON数据中的逻辑来确定何时放置逗号。
所以你的数据看起来像这样:
{ "items": [ {"name": "red", "comma": true}, {"name": "green", "comma": true}, {"name": "blue"} ] }
和你的模板
{{#items}} {{name}}{{#comma}},{{/comma}} {{/items}}
我知道这不是优雅的,但正如别人所说,胡子是非常轻量级的,不提供这样的function。
我认为更好的方法是dynamic地改变模型。 例如,如果您使用的是JavaScript:
model['items'][ model['items'].length - 1 ].last = true;
并在您的模板中使用倒置部分:
{{#items}} {{name}}{{^last}}, {{/last}} {{/items}}
呈现该逗号。
欺骗和使用CSS。
如果你的模型是:
{ "items": [ {"name": "red"}, {"name": "green"}, {"name": "blue"} ] }
然后制作你的模板
<div id="someContainer"> {{#items}} <span>{{name}}<span> {{/items}} </div>
并添加一点CSS
#someContainer span:not(:last-of-type)::after { content: ", " }
我猜,有人会说这是在演示文稿中join标记的不好的情况,但我不认为是这样。 逗号分隔值是一个演示决定,使解释底层数据更容易。 这与在条目上交替字体颜色相似。
如果碰巧使用jmustache ,则可以使用特殊的-first
或-last
variables:
{{#items}}{{name}}{{^-last}}, {{/-last}}{{/items}}
小胡子是否提供了一种优雅的方式来解决这个问题已经得到解答,但是我想到了最好的方法是使用CSS而不是改变模型。
模板:
<ul class="csl">{{#items}}<li>{{name}}</li>{{/items}}</ul>
CSS:
.csl li { display: inline; } .csl li:before { content: ", " } .csl li:first-child:before { content: "" }
这适用于IE8 +和其他现代浏览器。
我想不出许多情况下,你想要列出<ul>
或<ol>
之外的未知数量的项目,但这是你如何做的:
<p> Comma separated list, in sentence form; {{#each test}}{{#if @index}}, {{/if}}{{.}}{{/each}}; sentence continued. </p>
会产生:
Command separated list, in sentence form; asdf1, asdf2, asdf3; sentence continued.
这是把手,介意你。 如果test
是一个数组,则@index
将起作用。
小胡子里没有内置的方法。 你必须改变你的模型来支持它。
在模板中实现这一点的一种方法是使用倒排select帽{{^last}} {{/last}}
标签。 它只会省略列表中最后一项的文字。
{{#items}} {{name}}{{^last}}, {{/last}} {{/items}}
或者,如果您使用的是inheritance的语言,则可以将分隔符string作为", "
到对象,最好是基类,然后将“delimiter”设置为最后一个元素的空string" "
:
{{#items}} {{name}}{{delimiter}} {{/items}}
问题是:
是否有一个优雅的方式来expression一个逗号分隔列表,没有尾随逗号?
然后改变数据 – 作为最后一个项目时,它已经隐含在它作为数组中的最后一个项目 – 是不优雅的。
任何具有数组索引的胡须模板语言都可以正确地做到这一点。 即。 而不添加任何数据 。 这包括handlebars,ractive.js和其他stream行的胡须实现。
{{# names:index}} {{ . }}{{ #if index < names.length - 1 }}, {{ /if }} {{ / }}
对于JSON数据,我build议:
Mustache.render(template, settings).replace(/,(?=\s*[}\]])/mig,'');
正则expression式将删除任何,
最后的属性后悬挂。
这也将从string值中删除“,}”或“,]”,所以确保你知道什么数据将被放入你的JSON
正如小胡子在把手上,为什么不使用@datavariables? 我发现这是最干净的select:
{{#if @last}}, {{/if}}
更多信息: http : //handlebarsjs.com/reference.html#data
有趣。 我知道这是一种懒惰,但我通常通过在值赋值中进行模板来避免这种情况,而不是用逗号来界定值。
var global.items = {}; {{#items}} global.items.{{item_name}} = {{item_value}}; {{/items}}
我倾向于认为这是一个非常适合CSS的任务(如其他人所回答的)。 但是,假设您正在尝试执行类似于生成CSV文件的操作,那么您将无法使用HTML和CSS。 另外,如果你正在考虑修改数据来完成这个工作,这可能是一个更为简单的方法:
var data = { "items": [ {"name": "red"}, {"name": "green"}, {"name": "blue"} ] }; // clone the original data. // Not strictly necessary, but sometimes its // useful to preserve the original object var model = JSON.parse(JSON.stringify(data)); // extract the values into an array and join // the array with commas as the delimiter model.items = Object.values(model.items).join(','); var html = Mustache.render("{{items}}", model);
如果您使用的是Java,则可以使用以下方法:
MustacheFactory mf = new DefaultMustacheFactory(); Mustache test = mf.compile(new StringReader("{{#test}}{{#first}}[{{/first}}{{^first}}, {{/first}}\"{{value}}\"{{#last}}]{{/last}}{{/test}}"), "test"); StringWriter sw = new StringWriter(); test.execute(sw, new Object() { Collection test = new DecoratedCollection(Arrays.asList("one", "two", "three")); }).flush(); System.out.println(sw.toString());