句柄为缺少的字段输出null

时间:2014-07-17 19:35:42

标签: javascript json html-table handlebars.js missing-data

我正在尝试使用把手来格式化从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”来编写。

我在想也许我应该写一个寄存器,但如果是这样,我该怎么办呢?

2 个答案:

答案 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}}