幸いなことに、この問題全体および同様の問題に対する解決策は、リアクティブなテンプレートを可能にするコア Meteor パッケージであるBlaze パッケージの形で Meteor API に提供されています。リンクされたドキュメントを見ると、Blaze パッケージには、リアクティブ コンテンツと非リアクティブ コンテンツの両方をプログラムで作成、レンダリング、および削除するための幅広いソリューションを可能にする関数の長いリストが用意されています。
上記の問題を解決するには、次のことを行う必要があります。
まず、アプリケーション用に動的にレンダリングする必要があるさまざまな HTML チャンクを予測します。この場合、これらのチャンクは<div>{{name}}</div>
andになります<div>{{age}}</div>
が、実際には有効な HTML であれば何でもかまいません (ただし、まだパブリック API の一部ではありませんが、将来、開発者はこのコンテンツをより動的な方法で定義するためのオプションが増える予定です。ドキュメントでここに記載されているように)。これらを次のように小さなテンプレート定義に入れます。
<template name="nameDiv">
<div>{{name}}</div>
</template>
と
<template name="ageDiv">
<div>{{age}}</div>
</template>
次に、firstTemplate
テンプレートの定義を変更して、次のようにプログラムで参照できる HTML ノードを含める必要があります。
<template name="firstTemplate">
<div></div>
</template>
firstTemplate
次に、Blaze パッケージによって提供される関数の一部、つまりBlaze.With、Blaze.render、およびBlaze.removeを利用するテンプレート用にロジックを定義する必要があります (ただし、次のロジックを変更して、代わりにBlaze.renderWithData関数を使用します。これはすべて、ロジックをどのように定義するかについての個人的な好みに基づいています - 説明のために、以下に考えられる解決策を 1 つだけ示します)。
Template.firstTemplate.onRendered(function() {
var dataContext = Template.currentData();
var unrenderedView = Blaze.With(dataContext, function() {
// Define some logic to determine if name/age template should be rendered
// Return either Template.nameDiv or Template.ageDiv
});
var currentTemplate = Template.instance();
var renderedView = Blaze.render(unrenderedView, currentTemplate.firstNode);
currentTemplate.renderedView = renderedView;
});
Template.firstTemplate.onDestroyed(function() {
var renderedView = Template.instance().renderedView;
Blaze.remove(renderedView);
});
onRendered
したがって、テンプレートの関数でここで行っていることはfirstTemplate
、ページにレンダリングするデータ (名前または年齢のいずれか) を動的に決定し、Blaze.With()
関数を使用してそのテンプレートのレンダリングされていないビューを作成することです。firstTemplate
テンプレートのデータ コンテキストを使用します。次に、firstTemplate
動的に生成されたコンテンツを含めるテンプレート要素ノードを選択し、両方のオブジェクトを関数に渡しますMeteor.render()
。これにより、指定された要素ノードをレンダリングされたコンテンツの親ノードとしてページにレンダリングされていないビューがレンダリングされます。
関数の詳細を読むと、レンダリングされたビューが関数を使用して削除されるか、指定された親ノードが DOM から削除さBlaze.render()
れるまで、このレンダリングされたコンテンツはリアクティブのままであることがわかります。Blaze.remove()
上記の例では、呼び出しから受け取ったレンダリングされたビューへの参照を取得し、Blaze.render()
それをテンプレート オブジェクトに直接保存しています。これは、テンプレート自体が破棄されたときに、レンダリングされたビューをonDestroyed()
コールバック関数で手動で削除し、確実に破棄されるようにするためです。