把手 – 是否有可能在部分访问父上下文?

我有一个句柄模板,加载一个子元素的部分。

我需要从调用模板的父上下文中访问variables,从部分内部。 ..似乎没有解决任何内部的部分。

简化代码如下所示:

模板

  {{#each items}} {{> item-template}} {{/each}} 

部分

  value is {{value}} 

(显然真正的代码是更复杂的,但它是相同的原则,在部分..似乎是不明确的。)


为了显示它是未定义的,我已经使用了一个非常简单的帮手,像这样:

 Handlebars.registerHelper('whatis', function(param) { console.log(param); }); 

并更新了上面的代码:

更新的模板

  {{#each items}} {{whatis ..}} <-- Console shows the correct parent context {{> item-template}} {{/each}} 

更新的部分

  {{whatis ..}} <-- Console shows "undefined" value is {{value}} 

有没有办法解决这个问题? 我错过了什么吗?

编辑:有一个问题关于这个问题在handlebars的github项目

以防万一谁绊倒这个问题。 这个function现在在Handlebars中存在。

做这个:

 {{#each items}} {{! Will pass the current item in items to your partial }} {{> item-template this}} {{/each}} 

工作小提琴(由安德鲁·亨德森的把手请求#385启发) http://jsfiddle.net/QV9em/4/

 Handlebars.registerHelper('include', function(options) { var context = {}, mergeContext = function(obj) { for(var k in obj)context[k]=obj[k]; }; mergeContext(this); mergeContext(options.hash); return options.fn(context); }); 

以下是你如何设置父模板:

 {{#each items}} {{#include parent=..}} {{> item-template}} {{/include}} {{/each}} 

而部分:

 value is {{parent}} 

2.0.0开始, partials现在支持传入值

 {{#each items}} {{> item-template some_parent_var=../some_parent_var}} {{/each}} 

花了我一段时间find这个,希望对别人有用!

您可以使用一些build议的解决scheme,从链接到github的评论:

https://github.com/wycats/handlebars.js/issues/182#issuecomment-4206666
https://github.com/wycats/handlebars.js/issues/182#issuecomment-4445747

他们创build助手将信息传递给部分。

将父上下文传递给partial的最简单方法是在partial中执行循环。 通过这种方式,父上下文默认传递,当你在部分内部执行循环时, {{../variable}}约定可以访问父上下文。

这里的例子小提琴 。

数据

 { color: "#000" items: [ { title: "title one" }, { title: "title two" }, ] } 

模板

 <div class="mainTemplate"> Parent Color: {{color}} {{> partial}} </div> 

部分

 <div> {{#each items}} <div style="color:{{../color}}"> {{title}} </div> {{/each}} </div> 

我创build了每个Helper函数,该函数在关键字parentContext下的子上下文中包含父键/值。

http://jsfiddle.net/AndrewHenderson/kQZpu/1/

注意:下划线是一个依赖项。

 Handlebars.registerHelper('eachIncludeParent', function ( context, options ) { var fn = options.fn, inverse = options.inverse, ret = "", _context = []; $.each(context, function (index, object) { var _object = $.extend({}, object); _context.push(_object); }); if ( _context && _context.length > 0 ) { for ( var i = 0, j = _context.length; i < j; i++ ) { _context[i]["parentContext"] = options.hash.parent; ret = ret + fn(_context[i]); } } else { ret = inverse(this); } return ret; 

});

使用方法如下:

 {{#eachIncludeParent context parent=this}} {{> yourPartial}} {{/eachIncludeParent}} 

在部分中使用{{parentContext.value}}访问父上下文值

我需要像这样的dynamic表单属性…

  {{#each model.questions}} <h3>{{text}}</h3> {{#each answers}} {{formbuilder ../type id ../id text}} {{/each}} {{/each}} 

和一个像这样的帮手

  Handlebars.registerHelper('formbuilder', function(type, id, qnum, text, options) { var q_type = options.contexts[0][type], a_id = options.contexts[1].id, q_number = options.contexts[0][qnum], a_text = options.contexts[1].text; return new Handlebars.SafeString( '<input type=' + q_type + ' id=' + a_id + ' name=' + q_number + '>' + a_text + '</input><br/>' ); }); 

哪个产生…

 <input type="checkbox" id="1" name="surveyQ0">First question</input> 

我的模型是一个混合在一起的数组和对象的大块。 值得注意的是,使用'../'就像'../type'一样,传递父模型作为上下文,没有它,比如使用'id',它传入当前模型作为上下文。