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

How to get the value when using Lambda in Hogan.js

本文关键字:Lambda Hogan js      更新时间:2023-09-26

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

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中使用这个数据,而且还在客户端进行其他计算。

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

是的。

严格遵守规范的Mustache实现是非常有限的。你的选择是,在你的lambda代码中,渲染"{{Cost}}"字符串(你应该得到这个字符串和一个渲染函数作为你的lambda参数),并将渲染字符串解析成一个浮点数,你的成本。

肯定不干净。但这是可行的。不要忘记在您正在使用的Mustache实现的存储库中打开一个issue。

我认为我们有两个选择。

在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}}
如问题所述,我们可以使用这个对象。

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