如何在Hogan.js中使用Lambda时获取值

时间:2013-01-22 14:02:24

标签: javascript hogan.js

我有以下函数在jQuery中处理AJAX成功回调:

function success(data) {
    var templateData = {
        items: data,
        formatMoney: function () {
            return function (value) {
                return Globalization.format(value, 'N');
            };
        }
    };

    // fill reports table
    var filledTable = tableTemplate.render(templateData);
    $tableContainer.html(filledTable);
}

以下是我的模板的样子:

{#Items}}
<tr>
    <td>{{ProductId}}</td>
    <td>{{#formatMoney}}{{Cost}}{{/formatMoney}}</td>
</tr>
{{/Items}}

问题在于,我获得{{Cost}}而不是Cost的价值。我知道它应该如何工作,因为它在胡子手册(http://mustache.github.com/mustache.5.html)中描述,但我想得到的价值。

this会指向我的产品对象,因此我可以使用this.Cost获得成本,但这是一个简单的案例,我有很多具有许多需要格式化的属性的对象类型,因此我需要一个通用的解决方案保留DRY

我也可以在服务器端计算这个,但我更喜欢在客户端这样做,因为我不仅将这些数据用于hogan,还用于客户端的其他计算。

是否有更直接,通用和客户端方式来获取Cost的值而不是未渲染的文字块?

2 个答案:

答案 0 :(得分:1)

是的。

严格遵守规范的Mustache实现非常有限。您的选项将在您的lambda代码中呈现“{{Cost}}”字符串(您应该将此字符串和渲染函数作为您的lambda参数),并将渲染后的字符串解析为浮点数,即成本。 / p>

肯定不干净。但它会奏效。不要忘记在您正在使用的Mustache实现的存储库中打开一个问题。

答案 1 :(得分:0)

我认为我们有两种选择。

1)在hogan.js中使用lambdas

res.render("template", {
          lambdas:{
            formatMoney: function( cost ){
              return cost.format('usd');
            }
          });

,模板应为

{#Items}}
<tr>
    <td>{{ProductId}}</td>
    <td>{{#lambdas.formatMoney}}{{Cost}}{{/lambdas.formatMoney}}</td>
</tr>
{{/Items}}

2)如问题中所述,我们可以使用此对象。

Javascript代码

res.render("template", {
  formatMoney:{
    return function(key){
      var cost = this[key];
      return cost.format('usd');
    };
  }
});

,模板是

{#Items}}
<tr>
    <td>{{ProductId}}</td>
    <td>{{#formatMoney}}Cost{{/formatMoney}}</td>
</tr>
{{/Items}}