これを行う 1 つの方法は、カーソル/コレクション オブザーバーを使用することです。Meteor アプリでこのメソッドを使用して Flot チャートを更新していますが、うまく機能します。
関数で最初のプロットを作成した後Template.example.rendered
、コレクションに新しいドキュメントが追加 (または削除) されるたびにチャートを更新するカーソル オブザーバーを追加します。
// Subscribe to collection (or no need to do this if it's already done on your route)
Meteor.subscribe('dataReadings', someFilterVarOrNot);
// Add a cursor observer for all documents added with a date greater
// than right now (uses moment.js)
// (If you don't do this, you'll get an "added" fire for every document
// that's ALREADY been added - not sure why it does this but it does
dataReadingsObserveHandle = DataReadings.find({
createdAt: {$gte: moment().toDate()}}).observe({
// Fires anytime a new document is added
added: function(dataReading) {
$('#flot').data("plot").setData(dataReading.data);
$('#flot').data("plot").draw();
// Or setup whatever query/calculation you need to assemble a
// new data set for your chart, there are also some other observers like
// observeChanges() which let you see how a document has changed versus
// being added or removed
},
// Fires anytime a document is removed
removed: function(removedDataReading) {
// Update and redraw chart like above...
}
});
dataReadingsObserveHandle
は意図的にグローバルであるため、後で破棄できます。これは、明らかにコレクション オブザーバーがサーバーを集中的に使用するためです。破棄する必要がある場所にスコープ アクセスできる場合、これは必ずしもグローバルである必要はありません。
// Once your chart no longer needs to be updated call...
dataReadingsObserveHandle.stop();
dataReadingsObserveHandle = null;
ユーザーが別のテンプレートに移動し、チャートを見ていない場合、オブザーバーは自動的に破棄されると思います。詳細については、 http://docs.meteor.com/#observeを参照してください。
ReactiveVar
orを使用してこれを行う他の方法について知りたいですDeps.dependency
。特にそれらがより効率的である場合