2015-02-24 66 views
1

我想有一個遞歸模板是這樣的:流星遞歸模板無效

<template name="generate"> 
    {{#if elements}} 
    {{#each elements}} 
     <div>{{#if elements}}{{> generate}}{{/if}}</div> 
    {{/each}} 
    {{else}} 
    {{> generate elements=getElements}} 
    {{/if}} 
</template> 

與助手:

Template.generate.helpers({ 
    getElements: function() { 
    return Elements.find() 
    } 
}) 

和 「元素」 數據對象:

[{ 
    _id : "fgQ4GHrrZGFFGWPZQ", 
    elements" : [{ 
    _id : "hY8iAYJC4KBwGKN84", 
    elements : [] 
    }] 
},{ 
    _id : "rtMNfaQYwqzNTYqoD", 
    elements : [{ 
    _id : "p2wJeGdtiGMYBQtpW", 
    elements : [] 
    }] 
}] 

我遇到了鍵盤事件變得無響應並且其他功能停止工作的問題。是不是設計用於處理這種遞歸的模板?如果是這樣,我會嘗試一種不同的方法,但我認爲這將工作。任何人看到這個或有任何建議?謝謝!

編輯:這將工作。我的問題是在「render」回調中設置了一個鍵盤事件處理程序,這個回調函數被多次調用(每次模板被渲染時)導致我提到的問題。我會刪除這個問題,但stackoverflow。謝謝everybuddy!

+0

我肯定模板可以處理遞歸,所以你可能有無限遞歸。請記住,空數組('[]')是真的。 – 2015-02-24 07:43:41

+0

注意自我:總是複製/粘貼而不是使用自己的單詞,所以不會出現愚蠢的拼寫錯誤([空陣列在Space欄中的#if塊中是虛假的](https://github.com/meteor/meteor/blob/devel /packages/spacebars/README.md#ifunless),作爲(類型)在下面的答案中提到的一種)。 – 2015-02-24 13:55:15

+0

看起來像這樣可以起作用。我的代碼中有其他錯誤。感謝大家的幫助! – brg 2015-02-24 23:35:19

回答

1

這裏有一些錯誤。

首先。你具有助手名爲getElements您在調用它像elements

您呼叫的模板到同一個模板{{> generate}}

<template name="generate"> 
    {{#if elements}} 
    {{#each getElements}} 
     <div>{{#if elements}}{{> anotherTemplateName}}{{/if}}</div> 
    {{/each}} 
    {{else}} 
    {{> generate elements=getElements}} 
    {{/if}} 
</template> 

另外,elements助手看起來如何? {{#if elements}}

建議將在這裏使用嵌套模板。

<template name="generate"> 
     {{#if elements}} 
     {{> generateExample}} 
     {{else}} 
     {{> generate elements=getElements}} 
     {{/if}} 
    </template> 

<!-- Generate Example Template --> 

    <template name="generateExample"> 
      {{#each getElements}} 
       <div>{{#if elements}}{{> anotherTemplateName}}{{/if}}</div> 
      {{/each}} 
    </template> 

看看這個Understanding Spacebars一個更好的學習體驗

+0

沒有錯誤。我的代碼中有其他的東西導致了問題。謝謝您的幫助! – brg 2015-02-24 23:36:23

0

不同的Javascript,Spacebars considers an empty array [] to be falsy。因此葉節點(其中elements: [])上的起始{{#if elements}}將爲假,觸發{{> generate elements=getElements}},最終導致無限遞歸。

您可以通過完全移除{{#if}},然後調用{{> generate elements=getElements}}當您最初包括generate解決這個問題:

<body> 
    {{> generate elements=getElements}} 
</body> 

<template name="generate"> 
    {{#each elements}} 
     <div>{{#if elements}}{{> generate}}{{/if}}</div> 
    {{/each}} 
</template> 
+0

這不會起作用,因爲我不想將輔助器分配給正文模板。無論如何感謝您的幫助! – brg 2015-02-24 23:37:27