25

Handlebars.js 有一些奇怪的行为。它将值为 true 的布尔值呈现为字符串“true”,但将值为 false 的布尔值呈现为“”。

var booleanTestTrue = true;
var booleanTestFalse = false;

模板:

True: {{booleanTestTrue}}
False: {{booleanTestFalse}}

呈现给:

True: true
False: (empty string)

有没有办法解决这个问题?还是我必须写一个助手?

4

4 回答 4

22

您可以使用简单的块助手并实现#if,如下所示:

{{#if isTrue}}
       true
{{else}}
       false
{{/if}}
于 2013-09-16T23:18:29.667 回答
6

如果你想打印一个字符串,你应该传递一个字符串。

false.toString();

否则,是的,您将需要一个助手(除非您使用#if|#unless助手输出字符串)。

附带说明一下,如果您想出于调试目的打印这些值,请使用{{log booleanTestFalse}}.

于 2013-07-16T02:37:51.087 回答
3

我对此感到惊讶,并最终为它编写了一个简单的助手:

Handlebars.registerHelper( 'toString', function returnToString( x ){
    return ( x === void 0 ) ? 'undefined' : x.toString();
} );

然后,您将按如下方式调用它:

True:  {{toString booleanTestTrue}}
False: {{toString booleanTestFalse}}

在大多数情况下,您可以简单地逃脱return x.toString()。额外的检查避免了尝试调用toString未定义的值。

于 2014-01-13T13:03:05.200 回答
1

我使用了这个,类似于 Barney 的答案,但也支持 null 。

Handlebars.registerHelper('toString', function (v) { 
    return '' + v; 
});

然后,您将按如下方式调用它:

True:  {{toString booleanTestTrue}}
False: {{toString booleanTestFalse}}

但是,如果v是具有漂亮toString方法的对象,则需要进行更多编码。

于 2014-08-18T10:09:43.690 回答