2013-07-30 43 views
2

我可能會用錯誤的詞來描述我的問題,所以這裏是我正在使用的(簡化)代碼。如何將模板變量傳遞給模板輔助函數以保留上下文?

我很高興學習更好的方法來做到這一點,但我目前正在嘗試將{{assigneeId}}傳遞給名爲agentIs的模板幫助函數。問題是我無法找到傳遞值的正確方法。

<template name="ticket_list"> 
    {{#each tickets}} 
    {{> ticket}} 
    {{/each}} 
</template> 

<template name="ticket"> 
    <h3>{{title}}</h3> 
    <p>{{assigneeId}}</p> 
    {{> ticket_footer}} 
</template> 

<template name="ticket_footer"> 
    {{> agent_list}} 
</template> 

<template name="agent_list"> 
    <!-- {{assigneeId}} exists here as expected --> 
    assigneeId: {{assigneeId}} 
    <label for="agent">Agent</label> 
    <select id="agent" name="agent"> 
    {{#each agents}} 
     <!-- value passed: "{{assigneeId}}" --> 
     <option value="{{_id}}" {{#if agentIs "{{assigneeId}}"}}selected{{/if}}> 
     {{profile.name}} 
     </option> 
     <!-- value passed: undefined --> 
     <option value="{{_id}}" {{#if agentIs assigneeId}}selected{{/if}}> 
     {{profile.name}} 
     </option> 
     <!-- value passed: JSON.parse error --> 
     <option value="{{_id}}" {{#if agentIs {{assigneeId}}}}selected{{/if}}> 
     {{profile.name}} 
     </option> 
    {{/each}} 
    </select> 
</template> 
Template.agent_list.agents = function() { 
    return Meteor.users.find({"profile.is_agent": true}, {sort: {profile: 1}}); 
} 

Template.agent_list.agentIs = function(assigneeId) { 
    return this._id === assigneeId; 
}; 
+0

爲什麼你不能將一些模板調用包裝到'with'塊幫助器中?或者我沒有得到這個問題。 – imslavko

+0

@imslavko請寫出一個例子,並將其添加爲答案。我不熟悉Meteor和Handlebars,對於實現方面的任何反饋將不勝感激。 – giraffeslacks

回答

3

正確的語法是:

{{#if agentIs ../assigneeId}}selected{{/if}} 

的{{#each代理}}塊助手介紹了模板的上下文樹一個新的水平(新的上下文對應於當前代理),這就是爲什麼您需要從一個層面「回頭」以正確引用受讓人所在的前一個環境。

+0

我完全理解你在說什麼,雖然語法從來沒有跨過我的腦海,我不知道如何找到它。這個語法是否有正式名稱? – giraffeslacks

+2

http://handlebarsjs.com/是模板系統。 http://docs.meteor.com/#templates - Meteor的文檔。 – imslavko

+0

哇,你只是用'../'的東西吹了我的腦袋。無法告訴你,當循環訪問父項時,這將會有多大幫助。希望這被記錄在docs.meteor.com的某處。如果是我沒有看到它。 – CodeChimp

相關問題