2011-09-23 76 views
6

我在我的小鬍子模板(使用Mustache.js)中遇到名稱衝突的問題。這個例子說明了這兩個問題:有沒有辦法在我的Mustache.js模板中解決嵌套結構中的名稱衝突?

我傳遞這樣的數據:

{'recs': {'code': 'foo', 'id': 1 
      'childRecs': [{'id': 2}, 
         {'code': 'bar', 'id': 3}] 
     } 
} 

進入這個模板:

{{#recs}} 
    Record ID: {{id}} 
    {{#childRecs}} 
    This child code is: [{{code}}] and its parent ID is: {{id}} 
    {{/childRecs}} 
{{/recs}} 

預計:

Record ID: 1 
This child code is: [] and its parent ID is 1 
This child code is: [bar] and its parent ID is 1 

實際:

Record ID: 1 
This child code is [foo] and its parent ID is 2 
This child code is [bar] and its parent ID is 3 
  1. 有在嵌套{{#childRecs}}塊沒有辦法來訪問父{{#recs}}{id}}{{/recs}}場 - 它是由{{#childRecs}}{{id}}{{/childRecs}}

  2. 如果{{#childRecs}}一個變量缺失覆蓋,並且相同的父可變名稱存在,沒有辦法阻止它打印父變量。

我的嵌套結構非常深並且有很多名稱衝突,因此將它們重命名爲不會碰撞的方式不是可行的選項。有沒有其他方法可以解決我的問題?

回答

6

我看到兩個選項:

  • 發送它呈現之前豐富的客戶端數據。例如, 可以遍歷所有的childRecs並添加新的parentId屬性 - 然後更新 您相應的模板,或者

  • 使用http://www.handlebarsjs.com/ - 它使鬍鬚語法,但增加了一些好吃的東西像訪問父上下文(通過../)。例如:

    {{#recs}} 
        Record ID: {{id}} 
        {{#childRecs}} 
         This child code is: [{{code}}] and its parent ID is: {{../id}} 
        {{/childRecs}} 
    {{/recs}} 
    
+0

我最後寫周圍Mustache.to_html一個包裝前面加上一個週期數等於該深度的其中遞歸重命名該數據對象的每個屬性。然後我修改了我的模板以匹配。這樣我必須在每次在模板中使用變量時明確指定深度,並且變量都是唯一的。 Handlebars.js看起來很誘人 - 不知道如果../是訪問父屬性的唯一方式,或者如果它在子節點上不存在這樣的屬性,則默認回退。我不喜歡後備。不幸的是,似乎還沒有成熟的Handlebar模板PHP解析器。 –

+0

本來我打算爲每個對象添加一個parentId屬性來引用它的父對象,但是我遇到的問題是嵌套深度達到幾個級別 - 沒有辦法反覆將樹遍歷到祖父母。 Mustache.js不允許具有相同名稱的嵌套標籤,例如{{#parentId}} {{#parentId}} {{val}} {{/ parentId}} {{/ parentId}},但只適用於一個可行的單一級別。 –

+0

我遇到了同樣的問題,只是增加了我的觀點。 {{catID}}現在是我的{{sub-cat}}視圖中的一個字段。它的工作原理....雖然它的另一個數據庫調用,我寧願不做。 –

相關問題