17

我肯定错过了关于 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将是被调用的部分的名称。

这似乎一定是一个非常常见的用例,但我在网上找不到任何这样的例子。我哪里出错了?

4

2 回答 2

18

部分存储在其中,Handlebars.partials因此您可以在自己的助手中手动访问它们。不过这里有一些棘手的地方:

  1. 的内容Handlebars.partials可以是字符串或函数,因此您必须在首次使用时编译部分内容。
  2. Handlebars 不知道局部是否会出现,text/plain因此text/html您需要在适当的时候调用您的助手。{{{...}}}{{...}}
  3. 这些东西没有完全记录在案(至少在我能找到的任何地方都没有),因此您必须对 Handlebars 源进行逆向工程并摸索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/

于 2013-08-25T17:30:32.983 回答
14

2016 年更新第 3 版车把添加了 动态部分。从文档:

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

{{> (whichPartial) }}

将评估whichPartial然后渲染其名称由此函数返回的部分。

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

 {{> (lookup . 'myVariable') }}
于 2015-10-04T12:56:59.050 回答