2013-03-11 65 views
10

在很多模板中,我想使用相同的功能,但它們必須在每個模板中定義。 這樣的:如何定義全局模板助手函數?

function getNodesById(id){ 
    return collection.find({sid:id}).fetch(); 
} 

Template.navigation.getNodesById= function(id){ 
    return getNodesById(id); 
} 

Template.body.getNodesById= function(id){ 
    return getNodesById(id); 
} 

HTML:

<Template name="navigation"> 
... 
{{#each getNodesById '1'}} 
... 
{{/each}} 
... 
</Template> 
<Template name="body"> 
... 
{{#each getNodesById '1'}} 
... 
{{/each}} 
... 
</Template> 
... 
<Template name="..."> 
..... 
</Template> 

在那裏可以定義的,而不是一個模板地球儀模板函數什麼辦法?只是喜歡它: 在javascript中:

 
    defined global tempele.functionA = function(...){ 
     return ... 
    } 

在HTML:

<Template name ="a"> 
    {{#each functionA ...}} 
    {{/each }} 
</Template> 

<Template name ="b"> 
    {{#each functionA ...}} 
    {{/each }} 
</Template> 
<Template name="..."> 
    {{ #.. functionA ...}} 
     .... 
    {{/...}} 
</Template > 

我能做到這一點?我希望我能清楚地描述問題。

回答

14

你可以直接註冊你的助手和把手。這是我在用的用於顯示當前用戶的電子郵件地址:

Handlebars.registerHelper('currentUserName', function() { 
    var user = Meteor.user(); 
    if (_.isUndefined(user) || _.isNull(user)) { 
     return new Handlebars.SafeString("<i class='icon-spin icon-spinner'></i> Login"); 
    } 
    return user.emails[0].address; 
}); 

在任何模板,只需要調用{{currentUserName}}。對你來說,這將是

Handlebars.registerHelper('getNodeById', function (id) { 
    return collection.find({sid:id}).fetch(); 
}); 

作爲一個方面說明:看你如何使用它,你可能已經得到了流星的想法錯了。流星是數據驅動的 - 不要試圖執行流動驅動的範例。如果您在模板中缺少一些數據,則應更改數據源,而不是在模板中獲取它。

+0

謝謝你的提醒,我想我是錯了,在start.Meteor是數據驅動的,我會記請記住,謝謝! – 2013-03-12 02:10:34

3

對於流星0.8或更高,使用UI.registerHelper將完成這項工作。

13

從Meteor 1.0開始,文檔here指示開發人員使用Template.registerHelper來定義全局可用的模板助手。

所以在這個問題的情況下,正確的代碼格式是這樣的:

Template.registerHelper("getNodesById", function(id) { 
     return collection.find({sid: id}); 
    } 

然後,您可以參考此模板幫助您在任何模板在以下兩個方面:

{{getNodesById '1'}} 

{{#each getNodesById '1'}} 
     ... 
    {{/each}}