4

我有以下在 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 的值。我知道这就是它在 mustache 手册 (http://mustache.github.com/mustache.5.html) 中描述的工作方式,但我想获得这个值。

this将指向我的产品对象,因此我可以使用成本,this.Cost但这是一个简单的情况,我有许多对象类型具有许多需要格式化的属性,因此我需要一个通用的解决方案来保持东西DRY

我也可以在服务器端进行计算,但我更喜欢在客户端执行此操作,因为我不仅将这些数据与 hogan 一起使用,而且还用于客户端的其他计算。

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

4

2 回答 2

1

是的。

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

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

于 2013-01-28T19:21:10.307 回答
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}}
于 2015-06-10T14:15:35.790 回答