テンプレートを明示的に指定せずに、テンプレートを動的にロードできるようにしたいと思います。
例として:
<template name="foo">
</template>
'foo'はテンプレートですが、メソッドを呼び出して動的にロードできるようにしたいと思います。
Meteor.render(Meteor.loadTemplate('foo'));
これは可能ですか?
テンプレートを明示的に指定せずに、テンプレートを動的にロードできるようにしたいと思います。
例として:
<template name="foo">
</template>
'foo'はテンプレートですが、メソッドを呼び出して動的にロードできるようにしたいと思います。
Meteor.render(Meteor.loadTemplate('foo'));
これは可能ですか?
Meteor 0.9.x 新しい API
Dan Dascalescu は、Meteor に動的テンプレートが組み込まれていることを指摘しました。以前のバージョンで見られた余分なコードを含める必要がないため、これは便利です。
{{> Template.dynamic template=template [data=data] }}
Meteor 0.8.x レガシーの場合
データのない動的テンプレート: Boris Kotov の更新された Blaze (0.8.0) の回答は正しい軌道に乗っています (最新のドキュメントから取得) が、そのままでは機能しません。私は次のように動作しました:
{{> dynamicTemplate name=myDynName}}
<template name="dynamicTemplate">
{{#with chooseTemplate name}}
{{> template}}
{{/with}}
</template>
Template.dynamicTemplate.chooseTemplate = function (name) {
return { template: Template[name] };
};
もっと簡単な解決策があることを願っていますが、示されているようにテンプレートを JSON でラップする必要がありました。たぶん、これは他の誰かが前進するのに役立ちます。
データを含む動的テンプレート: データを動的にしたい場合は、必ず反応できるヘルパー メソッドを作成してください。効果を確認するには、必ずどこかで Session.set() を実行してください。
// Inside "myContainingTemplate"
{{> dynamicTemplateWithData name=myDynName data=myDataHelper}}
<template name="dynamicTemplateWithData">
{{#with chooseTemplate name}}
{{#with ../data}}
{{> ..}}
{{/with}}
{{/with}}
</template>
Template.dynamicTemplateWithData.chooseTemplate = function (name) {
return Template[name];
};
Template.myContainingTemplate.helpers({
myDataHelper: function () {
Session.get('myReactiveKey');
}
});
Meteor.render を見つけましたが、欠けているのはテンプレートの読み込みです。ドキュメントでは、 Template.foo() を呼び出してテンプレートの HTML を返すことができると述べています。
http://docs.meteor.com/#template_call
それをまとめると、テンプレート foo またはその他のブラケットアクセスを使用してアクセスできます。
var templateName = "foo";
var fragment = Meteor.render( function() {
return Template[ templateName ](); // this calls the template and returns the HTML.
});
次に、fragment はリアクティブ フラグメントであるため、テンプレートは引き続きライブ アップデートを受け取ることができます。フラグメントを Web ページに配置する必要があります (私は jQuery を使用しているため、この例も同様です)。
$("#htmlnode").html( fragment );
$("#htmlnode") は、テンプレートをレンダリングする DOM 内の単なるノードです。これで Web ページにレンダリングされたコンテンツができました。
ブレイズの更新:
特定のデータ コンテキストでテンプレートを動的にレンダリングする
年:
{{dynamicTemplate name="templateName" data=dataContext}}
Template.foo.dynamicTemplate = function (opts) {
return Template[opts.name](opts.data);
};
新規: (特に、Blaze では、包含ヘルパーまたはブロック ヘルパーへのキーワード引数が、新しいデータ コンテキストになる単一のオブジェクトにバンドルされます)
{{> dynamicTemplate name="templateName" data=dataContext}}
<template name="dynamicTemplate">
{{#with chooseTemplate name}}
{{#with ../data}} {{! original 'data' argument to DynamicTemplate}}
{{> ..}} {{! return value from chooseTemplate(name) }}
{{/with}}
{{/with}}
</template>
Template.dynamicTemplate.chooseTemplate = function (name) {
return Template[name];
}
ところで、私は実際に遊んだことはありませんが、これは新しい blaze ドキュメントから取ったものです。だから私はそれがそれを行う方法であるべきだと思います;)
私はちょうどこのようにやっています.jQueryは必要ありません:
編集済み
Template.mainContent.showContentFromRouter = function() {
return Template[Meteor.Router.page()]();
};
この場合、Meteor Router を使用しており、(Router から) 選択したテンプレートを返しますが、次のようにすることもできます。
Template.mainContent.showDynamicContent = function() {
return Template['someTemplateYouveDefined']();
};
https://github.com/meteor/meteor/wiki/Using-Blazeから
{{> post}}
Template.foo.helpers({
post: function () {
return Template[this.postName];
}
});
テンプレート インクルードは、テンプレート オブジェクトのヘルパーとデータの名前空間を検索するようになったため、使用するテンプレートをプログラムで簡単に選択できます。これは強力な機能であり、あるテンプレートを別のテンプレートのヘルパーとして割り当てるなどのパターンを許可して、オーバーライドできるようにします。
私にとって最も簡単な方法は、関数 get_dynamic_template を作成することでした。
var a= get_dynamic_template(template_name,data);
通常の変数 {{a}} としてレンダリングできるものを返します
この関数のコードは非常に単純です。
var get_dynamic_template = function(template_name,data)
{
return function(){
return new Handlebars.SafeString(
UI.toHTML(
Template[template_name].extend({data: function () { return data; }}))
);
};
}