如何处理胡须模板中的字符串或字符串数​​组

我有一个简单的/初学者的问题,在我的应用程序中使用胡须模板(或更准确地说,Hogan)。 我使用的API有时会返回一个字符串,有时会返回一个字符串数组。

我知道可以将字符串包装在单元素数组中,但是还有一种方法可以从胡须模板中处理这种选择性吗?

使用正常的部分
{{#stringOrArray}} <li>{{.}}</li> {{/stringOrArray}}如果它只是一个字符串, {{#stringOrArray}} <li>{{.}}</li> {{/stringOrArray}}不会打印该值。


我知道这有点晚,但这是我使用的:

{{#test.length}}
    {{#test}}<li>{{.}}</li>{{/test}}
{{/test.length}}

{{^test.length}}
    <li>{{test}}</li>
{{/test.length}}

这就像特征检测。 第一个代码块检查测试是否有长度,如果是,它是一个数组(是的,我知道字符串也应该有长度属性,但它们不)。 它会输出数组(如果它是一个数组),或者什么也不输(如果不是)。 如果没有长度(例如,它是一个字符串或整数等),则第二个块会打印出测试的值。这意味着您可以使用它:

var data = {
    test: "test1"
}

要么

var data = {
    test: [ "test1", "test2", "test3" ]
}

而不必为它是否是数组设置一个标志。 小胡子会为你解决它。


我不知道如何在没有任何帮助变量的情况下直接从对象执行此操作。 在将数据传递给模板之前,您可能会这样做,以避免混淆生成原始JSON对象的代码。

让这是你的JSON对象:

var data = {
    test: [ "test1", "test2", "test3" ]
}

让这是你的胡子模板:

{{#isArray}}
    {{#test}} <li>{{.}}</li>{{/test}}
{{/isArray}}

{{^isArray}}
    {{test}}
{{/isArray}}

让这是你的代码,编译/调用你的小胡子模板(我使用document.body.innerHTML,因为这是我如何设置JSFIDDLE示例):

var template = document.body.innerHTML;
document.body.innerHTML = Mustache.render(template, data);

上面的设置将打印出下面的内容,因为isArray是未定义的,所以它将执行用^符号否定isArray的块(例如,即使它是数组,它也会将数据视为字符串):

test1,test2,test3

我建议如果您不想触摸生成JSON的代码,那么在调用Mustache.render来设置isArray属性之前注入一些JavaScript。 下面是我将如何测试pop方法的存在,以便在将数据传递给模板之前正确设置isArray

if (data.test.pop) { data.isArray = 1; } else { data.isArray = 0; }
var template = document.body.innerHTML;
document.body.innerHTML = Mustache.render(template, data);

这将正确打印出所需的li元素:

test1
test2
test3

我在这里提供了一个工作示例,它在数据元素中同时执行数组和字符串实例,以显示该解决方案的工作原理:

http://jsfiddle.net/s7Wne/1/

链接地址: http://www.djcxy.com/p/19315.html

上一篇: How to handle string or array of strings in mustache template

下一篇: How to check if an element is an array or single