将变量用于部分模板

时间:2013-08-25 09:24:35

标签: handlebars.js partials

我肯定错过了Handlebars的工作方式。我需要根据变量的值调用不同的partial。目前,我发现这样做的唯一方法是:

<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 个答案:

答案 0 :(得分:17)

部分存储在Handlebars.partials中,因此您可以在自己的帮助程序中手动访问它们。这里有一些棘手的问题:

  1. Handlebars.partials的内容可以是字符串或函数,因此您必须在首次使用时编译部分内容。
  2. 句柄不知道部分是text/plain还是text/html,因此您需要根据需要在{{{...}}}{{...}}中呼叫您的帮助。
  3. 这些内容并未完全记录(至少不是我能找到的任何地方),因此您必须对Handlebars来源进行反向工程,并使用console.log(arguments)进行摸索,以弄清楚如何使用Handlebars.partials
  4. 当你打电话给帮手时,你必须手动通过this
  5. 不要害怕,这并不是那么复杂。像这样简单:

    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 :(得分:13)

2016年更新annotated Backbone source Version 3 of handlebars added。来自文档:

可以使用子表达式语法动态选择要执行的部分。

{{> (whichPartial) }}

将评估whichPartial,然后呈现此函数返回其名称的部分。

Subexpressions不解析变量,因此whichPartial必须是一个函数。如果一个简单变量具有部分名称,则可以通过lookup帮助程序解析它。

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