Handlebars中的Subexpressions

时间:2014-05-21 15:25:10

标签: javascript templates handlebars.js

为什么表达式1,2和4按预期工作,但不是3和5

HTML:

<script id="template" type="text/x-handlebars-template">
<ol>
    <li>{{dash 'abc' (concat a b)}}</li>
    <li>{{dash d (concat a b)}}</li>
    <li>{{dash c.c (concat a b)}}</li>
    <li>{{dash (concat a b) c.c}}</li>
    <li>{{dash (concat a e.e) c.c}}</li>
</ol>
</script>
<div id="rendered"></div>

JavaScript的:

Handlebars.registerHelper('dash', function(a, b) {
    return a + "-" + b;
});

Handlebars.registerHelper('concat', function(a, b) {
    return a + b;
});

var template = Handlebars.compile($("#template").html());
$("#rendered").html(template({a: 'a', b:'b', c:{c:'c'}, d:'d', e: {e: 'e'}}));

jsfiddle:http://jsfiddle.net/beradrian/6T8ah/

实际结果是

1. abc-ab
2. d-ab
3. c-[object Object]
4. ab-c
5. ae-[object Object]

我填写了Handlebars的错误报告:https://github.com/wycats/handlebars.js/issues/800

1 个答案:

答案 0 :(得分:0)

请勿在帮助程序

中的第一个参数中使用路径(点)表示法

如果第一个参数是路径(点)表示法,则忽略第二个参数,并替换为对第一个参数的根路径的引用。

这绝对是一个错误,根据您对错误报告的评论,它看起来像是在v2.0.0-beta.1中发布的。

如果您没有使用该版本,则解决方法是将帮助程序放在{{#with}}块中,并从第一个参数中删除路径表示法。

注意:虽然您无法在第一个参数中使用prop.subprop表示法,但可以毫无问题地使用../prop

例如:

<script id="template" type="text/x-handlebars-template">
    <ol>
        <li>{{dash 'abc' (concat a b)}}</li>
        <li>{{dash d (concat a b)}}</li>
        <li>{{#with c}}
            {{dash c (concat ../a ../b)}}
            {{/with}}</li>
        <li>{{dash (concat a b) c.c}}</li>
        <li>{{#with e}}
            {{dash (concat ../a e) ../c.c}}
            {{/with}}</li>
    </ol>
</script>
<div id="rendered"></div>

JSFiddle:http://jsfiddle.net/gfullam/oezb1539/