2012-12-28 83 views
3

我正在使用模板來生成流星中的HTML標記屬性,但似乎被打破。我無法在meteor的HTML標籤中放置模板,我想知道原因。如何使用模板在流星中生成動態HTML標記屬性?

我使用meteor-router進行路由。由於流星基本上只允許一個佈局,我想一個類補充人體表示當前視圖名稱,像這樣:

/client/layout.html:

<head> 
    <title>Meteor App</title> 
</head> 

<body {{> body-attributes}}> 
    {{renderPage}} 
</body> 

<template name="body-attributes">data-view-name="{{page}}" class="{{page}}"<template> 

,這樣我可以做這/client/layout.js:

Template['body-attributes'].page = function() { 
    return Meteor.Router.page(); 
}; 

但沒有工作,我得到了應用程序的說法對身體屬性是不支持的錯誤。將layout.html更改爲:

<head> 
    <title>Meteor App</title> 
</head> 

<body> 
    <div {{> body-attributes}}> 
     {{renderPage}} 
    </div> 
</body> 

<template name="body-attributes">data-view-name="{{page}}" class="layout-container {{page}}"<template> 

導致完全損壞的HTML。瀏覽器在頁面前顯示'>',控制檯元素面板如下所示: Console screenshots

爲什麼不能正常工作?

回答

3

在HTML標籤(在你的情況下,body標籤)中調用{{> body-attributes}}最終意味着Meteor將在該位置注入一個DocumentFragment到DOM中。

對於反應的緣故,這些DocumentFragments不在您的模板標記的香草複製品,而是在特殊Meteoresque反應性標籤,幫助後端引擎保持更新Template被包裹起來。

var _domFrag = Template.myTemplateName(); 

所以,Templates在流星情況下被設計的,因爲它的標籤內注入額外的標籤被嵌入的屬性上的HTML標籤:您可以通過調用函數模板和調查什麼_domFrag看起來像看到這。你的第二次嘗試更符合框架的工作方式。

希望能幫助解釋這種行爲。

+0

謝謝,我將你的答案標記爲答案,並且會說人們應該檢查[我的回答](http:// stackoverflow。(14072774/using-a-template-to-generate-html-tag-attributes-in-meteor-is-broken/14072874#14072874)來解決這個問題。 – Diogenes

2

我不知道爲什麼meteor不允許在最高級別的HTML標籤內部使用模板,但我找到了解決問題的方法。我改變的layout.html看起來像這樣:

<head> 
    <title>Meteor App</title> 
</head> 
<body> 
    {{> global-layout}} 
</body> 

<template name="global-layout"> 
    <div data-view-name="{{page}}" class="global-container {{page}}"> 
    {{renderPage}} 
    </div> 
</template> 

然後在layout.js切換的名字從body-attributesglobal-layout。這很好地解決了我的問題,但我仍然很想知道爲什麼第一個選項(在我的問題中)最初沒有起作用。

+3

模板中的''標記不是實際的HTML主體標記 - 它不引用相同的元素。這就是爲什麼它不起作用。這有點不直觀,但一旦你明白它們是兩個不同的東西,它就更有意義。 – Rahul

+1

這對head標籤來說是真的嗎?如果是這樣,那麼如何製作動態頁面標題呢? – Diogenes

+2

只需用Javascript設置'document.title'。這有點不同於你習慣的,但是從Javascript出來而不是從HTML出來。 – Rahul