通过句柄传递variables部分

我目前正在处理express.js应用程序中的handlebars.js。 为了保持模块化,我将所有的模板分成部分。

我的问题 :我找不到通过部分调用传递variables的方法。 假设我有一个部分,看起来像这样:

<div id=myPartial> <h1>Headline<h1> <p>Lorem ipsum</p> </div> 

假设我用名称“myPartial”注册了这个部分。 在另一个模板中,我可以这样说:

 <section> {{> myPartial}} </section> 

这工作正常,部分将按预期呈现,我是一个快乐的开发人员。 但是我现在需要的是在这个调用中传递不同variables的方法,例如在一个局部范围内检查是否给出标题。 就像是:

 <div id=myPartial> {{#if headline}} <h1>{{headline}}</h1> {{/if}} <p>Lorem Ipsum</p> </div> 

这个invokation应该是这样的:

 <section> {{> myPartial|'headline':'Headline'}} </section> 

或者。

我知道,我可以在呈现模板之前定义所需的所有数据。 但是我需要一种像刚刚解释的那样去做。 有没有可能的方法?

把手部分采取第二个参数成为部分的上下文:

 {{> person this}} 

在版本v2.0.0 alpha及更高版本中,您还可以传递命名参数的哈希值:

 {{> person headline='Headline'}} 

你可以看到这些场景的testing: https : //github.com/wycats/handlebars.js/blob/ce74c36118ffed1779889d97e6a2a1028ae61510/spec/qunit_spec.js#L456-L462 https://github.com/wycats/handlebars.js/ BLOB / e290ec24f131f89ddf2c6aeb707a4884d41c3c6d /规格/ partials.js#L26-L32

如果你写自己的帮手,这是非常可能的。 我们使用一个自定义的$ helper来完成这种交互(以及更多):

 /*/////////////////////// Adds support for passing arguments to partials. Arguments are merged with the context for rendering only (non destructive). Use `:token` syntax to replace parts of the template path. Tokens are replace in order. USAGE: {{$ 'path.to.partial' context=newContext foo='bar' }} USAGE: {{$ 'path.:1.:2' replaceOne replaceTwo foo='bar' }} ///////////////////////////////*/ Handlebars.registerHelper('$', function(partial) { var values, opts, done, value, context; if (!partial) { console.error('No partial name given.'); } values = Array.prototype.slice.call(arguments, 1); opts = values.pop(); while (!done) { value = values.pop(); if (value) { partial = partial.replace(/:[^\.]+/, value); } else { done = true; } } partial = Handlebars.partials[partial]; if (!partial) { return ''; } context = _.extend({}, opts.context||this, _.omit(opts, 'context', 'fn', 'inverse')); return new Handlebars.SafeString( partial(context) ); }); 

以防万一,这就是我所做的部分参数,types。 我已经创build了一个小部分帮助器,它将部分名称和散列的parameter passing给partial:

 Handlebars.registerHelper('render', function(partialId, options) { var selector = 'script[type="text/x-handlebars-template"]#' + partialId, source = $(selector).html(), html = Handlebars.compile(source)(options.hash); return new Handlebars.SafeString(html); }); 

这里关键的是Handlebars助手接受一个类似Ruby的参数散列 。 在助手代码中,它们作为函数的最后一个参数 – options – 在其hash成员中。 这样你可以接收到第一个参数 – 部分名称 – 然后获取数据。

然后,你可能想要从助手中返回一个Handlebars.SafeString ,或者使用“三重藏” – {{{ – 来防止它的双重转义。

这是一个或多或less完整的使用场景:

 <script id="text-field" type="text/x-handlebars-template"> <label for="{{id}}">{{label}}</label> <input type="text" id="{{id}}"/> </script> <script id="checkbox-field" type="text/x-handlebars-template"> <label for="{{id}}">{{label}}</label> <input type="checkbox" id="{{id}}"/> </script> <script id="form-template" type="text/x-handlebars-template"> <form> <h1>{{title}}</h1> {{ render 'text-field' label="First name" id="author-first-name" }} {{ render 'text-field' label="Last name" id="author-last-name" }} {{ render 'text-field' label="Email" id="author-email" }} {{ render 'checkbox-field' label="Private?" id="private-question" }} </form> </script> 

希望这有助于…某人。 🙂

这也可以使用key=value表示法在更高版本的句柄中完成:

  {{> mypartial foo='bar' }} 

允许您将特定值传递给您的部分上下文。

参考: 部分#182的上下文不同

听起来像你想要做这样的事情:

 {{> person {another: 'attribute'} }} 

耶胡达已经给了你一个这样做的方法:

 {{> person this}} 

但要澄清:

为了给你的部分自己的数据,只需在现有模型中给它自己的模型,就像这样:

 {{> person this.childContext}} 

换句话说,如果这是你给模板的模型:

 var model = { some : 'attribute' } 

然后添加一个新的对象给部分:

 var model = { some : 'attribute', childContext : { 'another' : 'attribute' // this goes to the child partial } } 

childContext成为像Yehuda所说的那样的部分语境 – 只能看到这个领域,但是它并没有看到(或者关心这个领域)。 如果你在顶层模型中有id ,并且在childContext中再次重复id ,那么这将工作得很好,因为partial只能看到childContext里面的childContext

接受的答案很好,如果你只是想在你的部分使用不同的上下文。 但是,它不会让您引用任何父上下文。 要传入多个参数,您需要编写自己的帮助程序。 这里是一个Handlebars 2.0.0的工作助手(另一个答案适用于版本<2.0.0 ):

 Handlebars.registerHelper('renderPartial', function(partialName, options) { if (!partialName) { console.error('No partial name given.'); return ''; } var partial = Handlebars.partials[partialName]; if (!partial) { console.error('Couldnt find the compiled partial: ' + partialName); return ''; } return new Handlebars.SafeString( partial(options.hash) ); }); 

然后在您的模板中,您可以执行如下操作:

 {{renderPartial 'myPartialName' foo=this bar=../bar}} 

在你的部分中,你将能够像上下文那样访问这些值:

 <div id={{bar.id}}>{{foo}}</div> 

是的,我迟到了,但是我可以为Assemble用户添加:你可以使用内build的"parseJSON"助手http://assemble.io/helpers/helpers-data.html 。 (在https://github.com/assemble/assemble/issues/416发现)。;