【问题标题】:Handlebars output null for missing fields缺少字段的车把输出 null
【发布时间】:2014-09-08 19:50:48
【问题描述】:

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

我在想也许我应该写一个 registerhelper 但如果是这样,我应该怎么做呢?

【问题讨论】:

  • 也可以不用任何特定的助手;查看我的更新答案。

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


【解决方案1】:

最新版本的 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 版本测试,有点过时了。没有用条件和循环测试。)

【讨论】:

    【解决方案2】:

    您可以按如下方式定义车把助手:

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

    【讨论】:

    • 效果很好!谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-02-14
    • 1970-01-01
    • 2013-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-20
    相关资源
    最近更新 更多