サブ要素のパーシャルをロードするハンドルバーテンプレートがあります。
呼び出しテンプレートの親コンテキストから、パーシャル内から変数にアクセスする必要があります。 ..
は、パーシャル内の何にも解決されないようです。
簡略化されたコードは次のようになります。
テンプレート
{{#each items}}
{{> item-template}}
{{/each}}
パーシャル
value is {{value}}
(明らかに実際のコードはより複雑ですが、部分的な..
は未定義のようです。
未定義であることを示すために、次のような非常に単純なヘルパーwhatis
を使用しました。
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}}
その問題を回避する方法はありますか?何か不足していますか?
EDIT:handlebars 'githubプロジェクト でこの質問に関連する未解決の問題があります
誰かがこの質問に出くわした場合に備えて。この機能は現在、ハンドルバーに存在します。
これを行う:
{{#each items}}
{{! Will pass the current item in items to your partial }}
{{> item-template this}}
{{/each}}
作業フィドル(AndrewHendersonによるハンドルバープルリクエスト#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.0partialsは値の受け渡しをサポートするようになりました 。
{{#each items}}
{{> item-template some_parent_var=../some_parent_var}}
{{/each}}
これを見つけるのにしばらく時間がかかりましたが、他の人にも役立つことを願っています!
親コンテキストをパーシャルに渡す最も簡単な方法は、パーシャル内でループを実行することです。これにより、デフォルトで親コンテキストが渡され、パーシャル内でループを実行すると、{{../variable}}
規約は親コンテキストにアクセスできます。
データ
{
color: "#000"
items: [
{ title: "title one" },
{ title: "title two" },
]
}
テンプレート
<div class="mainTemplate">
Parent Color: {{color}}
{{> partial}}
</div>
The Partial
<div>
{{#each items}}
<div style="color:{{../color}}">
{{title}}
</div>
{{/each}}
</div>
提案されたソリューションのいくつかは、githubへのリンクからのコメントで使用できます。
https://github.com/wycats/handlebars.js/issues/182#issuecomment-4206666
https://github.com/wycats/handlebars.js/issues/182#issuecomment-4445747
パーシャルに情報を渡すヘルパーを作成します。
キー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}}
を使用してパーシャルの親コンテキスト値にアクセスします
このような何かのために動的なフォーム属性が必要でした...
{{#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」などを使用しない場合は、現在のモデルをコンテキストとして渡すということです。