Javascript 缺少字段的手柄输出为空

Javascript 缺少字段的手柄输出为空,javascript,json,html-table,handlebars.js,missing-data,Javascript,Json,Html Table,Handlebars.js,Missing Data,我试图使用手柄来格式化从JSON文件接收的数据。我目前的结构与此类似: <table class="table table-striped"> <thead> <tr> <th>Name</th> <th>Mark</th> <th>Subje

我试图使用手柄来格式化从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>

名称
做记号
主题
学校
生日
{{{每个学生}
{{this.name}}
{{this.mark}}
{{this.subject}}
{{this.school}}
{{这个生日}}
{{/每个}}
我拥有的JSON文件没有一致的结构,一些student元素只包含name(缺少所有其他字段),有些元素只包含name和school

如果我使用我当前的代码来模板JSON文件,我将得到一个包含大量空白单元格的表,我想用“null”来代替


我在想也许我应该写一个注册帮助,但如果是这样,我应该怎么做呢

可以按如下方式定义把手辅助对象:

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}}
{{{#每个学生}
{{getStudentValue this.name}
{{getStudentValue this.mark}
{{getStudentValue this.subject}
{{getStudentValue this.school}
{{getStudentValue this.birth}
{{/每个}}

Handlebars.js的最新版本,用于报告
{myName}
{{something.myName}}
{myHelper someValue}}
中缺少的所有辅助对象和值,而无需在花括号中使用虚拟辅助对象:

handlebar.registerHelper('helperMissing',函数(/*[args,]options*/){
var options=arguments[arguments.length-1];
返回“缺少值:”+options.name;
});    
(使用2.0.0进行测试)

尽管问题是针对JavaScript的,但对于子孙后代,这里有一个解决方案:

最终把手把手=新把手();
/*
*默认情况下,Handlebar为缺少的值输出一个空字符串,
*如果缺少帮助程序,则引发异常。这里,永远不要
*引发异常,并在结果文本中显示警告。
*/
车把.注册表帮助许可(新助手(){
@凌驾
公共字符序列应用(最终对象上下文、最终选项)
抛出IOException{
返回“缺少值:”+options.helperName;
}
});
(使用最新版本1.3.2进行测试)

同样适用于:

final DefaultMustacheFactory mf=new DefaultMustacheFactory();
setObjectHandler(新的ReflectionObjectHandler(){
@凌驾
公共包装器查找(最终字符串名称,最终对象[]范围){
Wrapper=super.find(名称、范围);
if(缺失包装的包装实例){
返回新包装器(){
@凌驾
公共对象调用(对象[]作用域)引发GuardException{
返回“缺少值:”+名称;
}
};
}
返回包装器;
}
});

(用0.8.2版测试,有点过时。没有用条件和循环测试。)

效果很好!谢谢也可以不需要任何特定的助手;请参阅我的最新答案。