把手 – 是否有可能在部分访问父上下文?
我有一个句柄模板,加载一个子元素的部分。
我需要从调用模板的父上下文中访问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',它传入当前模型作为上下文。