如何处理胡须模板中的字符串或字符串数组
我有一个简单的/初学者的问题,在我的应用程序中使用胡须模板(或更准确地说,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