在小胡子模板中有没有拖尾逗号表示逗号分隔列表的优雅方式?

我正在使用小胡子模板库,并尝试生成一个逗号分隔列表,没有尾随逗号,例如

红色,绿色,蓝色

考虑到结构,使用尾随逗号创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-lastvariables:

 {{#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,则可以使用以下方法:

https://github.com/spullara/mustache.java/blob/master/compiler/src/test/java/com/github/mustachejava/util/DecoratedCollectionTest.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());