テンプレートを明示的に指定せずに動的にテンプレートをロードする機能が欲しいのですが。
例として:
<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レガシーの場合
動的テンプレートWithoutデータ:Boris Kotovの更新されたBlaze(0.8.0)の回答は正しい方向にあります(最新のドキュメントから取得)が、そうではありませんt現状のままで作業します。私は以下を機能させました:
{{> dynamicTemplate name=myDynName}}
<template name="dynamicTemplate">
{{#with chooseTemplate name}}
{{> template}}
{{/with}}
</template>
Template.dynamicTemplate.chooseTemplate = function (name) {
return { template: Template[name] };
};
より簡単な解決策があることを願っていますが、次のようにテンプレートをJSONでラップする必要がありました。多分これは誰かが前進するのを助けるでしょう。
動的テンプレートWithデータ:データを動的にしたい場合は、対応できるヘルパーメソッドを作成してください。効果を確認するには、必ずどこかで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 0.9.4-1.0のように、テンプレートを動的にレンダリングする方法は次のとおりです。この執筆時点では、他のすべての回答は廃止されていました。
一連のレコードを編集している、または新しいレコードを作成していて、いくつかのセッション変数に基づいてupdate
テンプレートまたはnew
テンプレートのいずれかをレンダリングしたいとします。
これを行うには2つの方法があります。
1)これはMeteor 0.9.4以降で公式に推奨されている方法です- Template.dynamic
:
<template name="records">
{{> Template.dynamic template=whichOne}}
</template>
<template name="recordUpdate">
...
</template>
<template name="recordNew">
...
</template>
Template.records.helpers({
whichOne: function () {
return Session.get('edit') ? 'recordUpdate' : 'recordNew'
// note that we return a string - per http://docs.meteor.com/#template_dynamic
}
});
2)これはMeteorのさまざまなバージョンで機能しますが、テンプレートが動的に選択されるかどうかが明確でないため、公式には推奨されません。
<template name="records">
{{> whichOne}}
</template>
{{! Note how "whichOne" is indistinguishable from a constant template name... }}
{{ ...like "recordUpdate" or "recordNew" below. }}
<template name="recordUpdate">
...
</template>
<template name="recordNew">
...
</template>
Template.records.helpers({
whichOne: function () {
return Session.get('edit') ? Template.recordUpdate : Template.recordNew
// note that we return a Template object, not a string
}
});
テンプレートにデータコンテキストを渡すには、次を使用します。
{{> Template.dynamic template=whichOne data=myData}}
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.
});
次に、フラグメントはReactiveフラグメントであるため、テンプレートは引き続きライブアップデートを受信できます。フラグメントをWebページに配置する必要があります(私はjQueryを使用しているため、この例でも使用しています)。
$("#htmlnode").html( fragment );
$( "#htmlnode")は、テンプレートをレンダリングしたいDOM内のノードです。これで、レンダリングされたコンテンツがWebページにあります。
私はこのようにしています、jQueryは必要ありません:
[〜#〜]編集済み[〜#〜]
Template.mainContent.showContentFromRouter = function() {
return Template[Meteor.Router.page()]();
};
この場合、Meteorルーターを使用していて、(ルーターから)選択したテンプレートを返しますが、次のようにすることができます。
Template.mainContent.showDynamicContent = function() {
return Template['someTemplateYouveDefined']();
};
ブレイズの更新:
特定のデータコンテキストでテンプレートを動的にレンダリングする
古い:
{{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];
}
ちなみに、実際にはいじっていませんが、これは新しいブレイズドキュメントから取ったものです。だから私はそれがそれを行う方法であるべきだと思います;)
https://github.com/meteor/meteor/wiki/Using-Blaze から
{{> post}}
Template.foo.helpers({
post: function () {
return Template[this.postName];
}
});
テンプレートインクルードは、ヘルパーの名前空間とテンプレートオブジェクトのデータを検索するようになりました。そのため、使用するテンプレートをプログラムで簡単に選択できます。これは強力な機能であり、あるテンプレートを別のテンプレートのヘルパーとして割り当てるようなパターンを許可して、オーバーライドできるようにします。
Meteor 0.8.x Legacy
ガイドとして Joc's 回答を使用して、 http://docs.meteor.com/#template_call を使用して同様に達成しましたが、代わりにヘルパーを使用して、 docs:
テンプレートヘルパー、Meteor.renderの本体、またはリアクティブHTMLが生成されているその他の設定内で呼び出されると、結果のHTMLに注釈が付けられ、リアクティブDOM要素としてレンダリングされます。
私のclient.jsは次のようになります。
Template.myPageTemplate.helpers({
dynamicTemplate: function() {
// conditional logic can be added here to determine which template to render
return Template.myDynamicTemplate();
}
});
そして私のhtmlは次のようになります:
<template name="myPageTemplate">
<h1>My Template</h1>
{{{dynamicTemplate}}}
</template>
<template name="myDynamicTemplate">
<h1>My Dynamic Template</h1>
</template>