我正在尝试使用把手来格式化从JSON文件接收的数据。我目前的结构类似于:
<table class="table table-striped">
<thead>
<tr>
<th>Name</th>
<th>Mark</th>
<th>Subject</th>
<th>School</th>
<th>Birthday</th>
</tr>
</thead>
<tbody>
{{#each students}}
<tr>
<td>{{ this.name }}</td>
<td>{{ this.mark }}</td>
<td>{{ this.subject }}</td>
<td>{{ this.school }}</td>
<td>{{ this.birthday }}</td>
</tr>
{{/each}}
</tbody>
</table>
我拥有的JSON文件没有一致的结构,一些学生元素只包含名称(缺少所有其他字段),有些只包含姓名和学校。
如果我使用我当前的代码来模拟JSON文件,我将获得一个包含大量空白单元格的表格,我想用“null”来编写。
我在想也许我应该写一个寄存器,但如果是这样,我该怎么办呢?
答案 0 :(得分:5)
最新版本的Handlebars.js support the following报告所有缺少的助手和值,例如{{myName}}
,{{something.myName}}
或{{myHelper someValue}}
,大括号内需要一个虚拟助手:
Handlebars.registerHelper('helperMissing', function(/* [args, ] options */) {
var options = arguments[arguments.length - 1];
return 'MISSING VALUE: ' + options.name;
});
(经2.0.0测试)
虽然问题出在JavaScript上,但对于后人来说这是Handlebars.java的解决方案:
final Handlebars handlebars = new Handlebars();
/*
* By default, Handlebars outputs an empty String for missing values,
* and throws an exception if a helper is missing. Here, make it never
* throw an exception, and show a warning in the result text.
*/
handlebars.registerHelperMissing(new Helper<Object>() {
@Override
public CharSequence apply(final Object context, final Options options)
throws IOException {
return "MISSING VALUE: " + options.helperName;
}
});
(使用最新版本测试,为1.3.2)
同样适用于Mustache.java:
final DefaultMustacheFactory mf = new DefaultMustacheFactory();
mf.setObjectHandler(new ReflectionObjectHandler() {
@Override
public Wrapper find(final String name, final Object[] scopes) {
Wrapper wrapper = super.find(name, scopes);
if (wrapper instanceof MissingWrapper) {
return new Wrapper() {
@Override
public Object call(Object[] scopes) throws GuardException {
return "MISSING VALUE: " + name;
}
};
}
return wrapper;
}
});
(经过0.8.2版测试,有点过时了。未经过条件和循环测试。)
答案 1 :(得分:3)
您可以按如下方式定义把手助手:
Handlebars.registerHelper("getStudentValue", function(val) {
if(val === undefined) {
return "null";
}
return val;
});
相应的标记看起来像:
{{#each students}}
<tr>
<td>{{getStudentValue this.name }}</td>
<td>{{getStudentValue this.mark }}</td>
<td>{{getStudentValue this.subject }}</td>
<td>{{getStudentValue this.school }}</td>
<td>{{getStudentValue this.birthday }}</td>
</tr>
{{/each}}