便利なレンダー ロギング関数を次に示します。各テンプレートがコンソールにレンダリングされた回数を記録します。最初のページの読み込み後にテンプレートが再レンダリングされる場合、それはテンプレートが依存するリアクティブ データ ソースが変更されたためです。このリアクティブ データ ソースがヘルパー メソッドでアクセスされた可能性があります。または、テンプレートがリスト アイテム ({{#each ...}}
ブロック ヘルパー内) であり、リスト アイテムが追加/移動/削除/変更された可能性があります。また、子テンプレートは、子がレンダリングまたは再レンダリングされるときに、親のレンダリングされたコールバックを呼び出すことに注意してください。したがって、親が実際に DOM から取り除かれ、元に戻されたと考えると混乱するかもしれませんが、そうではありません。
したがって、クライアント コードの最後でこの関数を呼び出して、レンダリング カウントを確認できます。
function logRenders () {
_.each(Template, function (template, name) {
var oldRender = template.rendered;
var counter = 0;
template.rendered = function () {
console.log(name, "render count: ", ++counter);
oldRender && oldRender.apply(this, arguments);
};
});
}
編集: これは、検索カーソルをラップして、カーソルへのすべての変更をコンソールに記録する方法です。これと同様の関数を、reactive-vision と呼ばれる作業中の新しいパッケージ用に作成しました。うまくいけば、すぐにリリースされます。
var wrappedFind = Meteor.Collection.prototype.find;
Meteor.Collection.prototype.find = function () {
var cursor = wrappedFind.apply(this, arguments);
var collectionName = this._name;
cursor.observeChanges({
added: function (id, fields) {
console.log(collectionName, 'added', id, fields);
},
changed: function (id, fields) {
console.log(collectionName, 'changed', id, fields);
},
movedBefore: function (id, before) {
console.log(collectionName, 'movedBefore', id, before);
},
removed: function (id) {
console.log(collectionName, 'removed', id);
}
});
return cursor;
};