2011-07-26 79 views
4

我試圖使用mustache.js作爲JSON數據的模板系統,我從外部API獲取回來。麻煩的是,JSON對象具有以散列值開頭的鍵,我不知道如何處理它們。對象的實例(和全簡化):如何處理key,mustache.js中的哈希?

{ 
    "items": [ 
     "description": { 
      "#cdata-section": "Description goes here" 
     } 
    ] 
} 

Mustache.js:

var template = '{{#items}}' + 
        '{{#description}}' + 
         '{{cdata-section}}' + 
        '{{/description}}' + 
       '{{/items}}'; 

顯然它不會承認CDATA段,因爲這不是關鍵的名稱。我不能使用{{#cdata-section}},因爲這個散列表示Mustache.js中的條件或枚舉。我似乎也無法逃脫它,{{\#cdata-section}}什麼都不匹配。

有沒有辦法解決這個問題?還是必須預先處理JSON對象?

+1

看看源代碼看起來它只是檢查是否存在'#',所以我覺得沒有什麼辦法:https://github.com/janl/mustache.js/blob/master/mustache。 JS#L100。 'include'函數只使用'indexOf'。 – pimvdb

+1

@pimvdb - 如果它既沒有'#'也沒有'^',它只能作爲函數跳過,所以如果它有一個或另一個,它將繼續使用該函數。 –

回答

1

也許更好的解決方案是修改mustache.js。有問題的行似乎是line 106與正則表達式

this.otag + "(\\^|\\#)\\s*(.+)\\s*" + this.ctag 

其中開口標籤匹配,接着^#,則任何的空間量,則至少一個字符,則任何的空間量。

我不是最好的正則表達式,而是一個合適的解決辦法是遵循開放標籤與斷言,它無法比擬{{\^{{\#

this.otag + "(?!\\\\)(\\^|\\#)\\s*(.+)\\s*" + this.ctag 

四倍反斜線獲得由JavaScript解釋爲\\ + \\ = \\,然後通過正則表達式作爲\ + \ = \。我沒有測試過這個,但它應該工作。

如果你的作品,考慮在他們的GitHub repository

編輯打開拉的要求爲你改變:我錯過了一個點:上line 152,看來你需要添加一個類似的說法。我會把這個作爲練習留給讀者。