将变量用于部分模板

nko*_*ren 17 partials handlebars.js

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

<template name="base">
  {{#if a}}{{> a}}{{/if}}
  {{#if b}}{{> b}}{{/if}}
  {{#if c}}{{> c}}{{/if}}
</template>
Run Code Online (Sandbox Code Playgroud)

并在相应的JS中:

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

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

Template.base.c = function () {
  return (mode === "c");
}
Run Code Online (Sandbox Code Playgroud)

......这让我非常啰嗦.我真正想做的是:

<template name="base">
  {{> {{mode}} }}
</template>
Run Code Online (Sandbox Code Playgroud)

换句话说,值mode将是被调用的partial的名称.

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

mu *_*ort 18

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

  1. Handlebars.partials可以是字符串或函数的内容,因此您必须在首次使用时编译部分.
  2. 车把不知道如果部分会text/plaintext/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);
});
Run Code Online (Sandbox Code Playgroud)

应该做的伎俩.然后你可以说:

{{{partial mode this}}}
Run Code Online (Sandbox Code Playgroud)

并继续进行更多有趣的事情.

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

  • @Fractalf:我听说你,官方的"文档"还有很多不足之处,我不得不多次查看源代码以了解发生了什么. (2认同)

Jos*_*tze 14

2016年更新:车把第3版添加了 动态部分.来自文档:

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

{{> (whichPartial) }}
Run Code Online (Sandbox Code Playgroud)

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

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

 {{> (lookup . 'myVariable') }}
Run Code Online (Sandbox Code Playgroud)