2013-02-28 134 views
16

說我們有一個父模板和子模板:流星子模板可以訪問父模板助手嗎?

<template name="parent"> 
    {{> child }} 
</template> 

<template name="child"> 
    {{#if show}} 
    //Do something 
    {{/if}} 
</template> 

如果我們分配「秀」給父模板:

if (Meteor.isClient){ 
    Template.parent.show = function(){ 
    return Session.get('isShowing'); 
    } 
} 

有沒有什麼辦法讓孩子模板訪問它?

+0

我會說這更是一個車把的問題 – 2013-02-28 03:54:00

+0

Handlebars支持'../',但是我不確定它會走多遠 – Swadq 2013-02-28 08:08:05

回答

8

編輯

你可以做一個通用的車把幫手,所以你可以在你的HTML的任何地方使用會話值:

客戶端JS

Handlebars.registerHelper('session', function(key) { 
    return Session.get(key); 
}); 

客戶端HTML

<template name="child"> 
    {{#if session "show"}} 
    //Do something 
    {{/if}} 
</template> 

同樣,您也可以在父模板中使用{{session "show"}}/{{#if session "show"}},而不必再使用Template.parent.show幫助程序。

關於使用../表示法。有些情況下可能無法正常工作:https://github.com/meteor/meteor/issues/563。基本上它可以在{{#block helpers}}中使用,但不能與模板一起使用,但如果它包含子模板,則它可以在塊助手中使用。

<template name="child"> 
    {{#if ../show}} 
     Do something 
    {{/if}} 
</template> 
+1

我在手柄文檔中看到了這個,但是您能否在Meteor中重現這一點?當我嘗試我在控制檯中出現錯誤:「未捕獲的錯誤:太多'..'段」。據我瞭解../引用我們正在使用的數據的父上下文,所以如果我們有:context = {name:John,posts:{post1:body1,post2:body2}}並且我們循環遍歷發佈屬性我們可以使用../來訪問名稱屬性。但我認爲我們不能使用../來訪問我們尚未訪問的全新數據對象,或者至少我無法使其工作。 – J2K 2013-02-28 19:56:14

+0

是的你是對的,它看起來像'../'符號不一定總是與子模板一起工作。我用另一個解決方案更新了答案 – Akshat 2013-02-28 20:11:53

+0

感謝您的回答。不完全是我所希望的(如果它工作,../show將是完美的),但我認爲這是一個有用且相當乾淨的工作。 – J2K 2013-03-01 18:56:35

2

您也可以註冊一個共同的幫手:

Template.registerHelper('isTrue', function(boolean) { 
    return boolean == "true"; 
}); 

,並調用它,就像在你的HTML:

<input type="checkbox" checked="{{isTrue attr}}"/>