2013-08-25 41 views
14

我肯定錯過了Handlebars的工作方式。我需要根據變量的值調用不同的部分。目前,我發現做到這一點的唯一方法是這樣的:將變量用於部分模板

<template name="base"> 
    {{#if a}}{{> a}}{{/if}} 
    {{#if b}}{{> b}}{{/if}} 
    {{#if c}}{{> c}}{{/if}} 
</template> 

,並在相應JS:

Template.base.a = function() { 
    return (mode === "a"); 
} 

Template.base.b = function() { 
    return (mode === "b"); 
} 

Template.base.c = function() { 
    return (mode === "c"); 
} 

...這令我非常冗長。我倒是真的喜歡做的是一樣的東西:

<template name="base"> 
    {{> {{mode}} }} 
</template> 

在換句話說,mode值將是被稱爲部分的名稱。

這似乎是它必須是一個非常常見的用例,但我找不到任何這種在線的例子。我哪裏錯了?

+2

官方** dynamic partials **(來自Joshua)真的應該是默認的答案。 – mikemaccana

回答

17

部分信息存儲在Handlebars.partials中,因此您可以通過自己的幫助程序手動訪問它們。有幾個棘手位雖然這裏:

  1. Handlebars.partials內容可以是字符串或函數,所以你必須編譯在第一次使用諧音。
  2. 把手不知道部分將是text/plain還是text/html,因此您需要撥打{{{...}}}{{...}}的助手。
  3. 這東西沒有完全記錄(至少不是我可以找到的任何地方),因此您必須對逆變器的源代碼進行逆向工程,然後使用console.log(arguments)來弄清楚如何使用Handlebars.partials
  4. 當您打電話給助手時,您必須手動通過this

不要害怕,它不是那麼複雜。這樣簡單的事情:

Handlebars.registerHelper('partial', function(name, ctx, hash) { 
    var ps = Handlebars.partials; 
    if(typeof ps[name] !== 'function') 
     ps[name] = Handlebars.compile(ps[name]); 
    return ps[name](ctx, hash); 
}); 

應該做的伎倆。然後你可以這樣說:

{{{partial mode this}}} 

並且開始更有趣的事情。

演示:http://jsfiddle.net/ambiguous/YwNJ3/2/

+1

感謝您指出這一點!就像你說的那樣,官方文檔在部分文章中是非常糟糕的。 – Fractalf

+2

@Fractalf:我聽說你,官方的「文檔」有很多不足之處,我不得不經過一遍以上的源代碼才能弄清楚發生了什麼。 –

+0

如果你需要服務器端版本,你可以在這裏找到http://stackoverflow.com/a/27820812/1563880 – nktssh

10

更新2016年Version 3 of handlebars addedDynamic Partials。從文檔:

可以使用子表達式語法動態選擇要執行的部分。

{{> (whichPartial) }} 

將評估whichPartial,然後呈現名稱由此函數返回的部分。

子表達式不解決變量,所以whichPartial必須是一個函數。如果一個簡單變量具有部分名稱,可以通過lookup幫助程序解決。

{{> (lookup . 'myVariable') }}