2011-07-26 41 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,看来你需要添加一个类似的说法。我会把这个作为练习留给读者。