通过句柄传递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发现)。;