2013-01-22 31 views
4
使用lambda時,爲了獲得價值

我有以下的功能,處理AJAX成功回調jQuery中:如何在Hogan.js

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}}成本的價值。我知道這是應該如何工作的,因爲它在鬍子手冊(http://mustache.github.com/mustache.5.html)中有描述,但我想要取而代之。

this將指向我的產品對象,所以我可以使用this.Cost獲得成本,而且這是一個簡單的例子,我有很多很多的屬性對象類型需要格式化,因此我需要一個通用的解決方案,以使事情DRY

我也可以在服務器端進行計算,但我更喜歡在客戶端執行此操作,因爲我不僅在hogan中使用此數據,而且還在客戶端上進行其他計算。

是否有更多直接的,通用的和客戶端的方式來獲取Cost的值而不是未渲染的文字塊?

回答

1

是的。

嚴格遵守規範的小鬍子實現是非常有限的。在你的lambda代碼中,你的選擇是渲染「{{Cost}}」字符串(你應該得到這個字符串和一個渲染函數作爲你的lambda參數),並將渲染後的字符串解析爲float,你的成本。

不乾淨,當然。但它會工作。不要忘記在正在使用的Mustache實施的存儲庫中打開一個問題。

+0

一些其它實施方案選擇引入支持 「過濾器」,如在{{formatMoney(成本)}}。例如見https://github.com/groue/GRMustache/blob/master/Guides/filters.md –

0

我想我們有兩個選擇。

1)使用lambda表達式在hogan.js

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