2013-03-15 10 views
13

複雑な流星のアプリケーションを持っているというだけの問題はないでしょう。どの反応クエリがトリガされたかを検出

私は実際には必要ないページの一部をリフレッシュさせるいくつかのアクションを持っています。しかし、find()(または複数のfind())がトリガーされているものを見つけるのが難しいです。私は問題のCollectionを知っていますが、find()はそうではありません。

私が使用するすべての検索でobserveChangesを使用できますが、それは余分なコードがたくさんあります。

トリガーされているものと何が原因かを簡単に確認する方法はありますか?

ありがとうございます!

答えて

19

ここで便利なレンダリングログ機能があります。各テンプレートがレンダリングされる回数をコンソールに記録します。最初のページが読み込まれた後にテンプレートが再レンダリングされるかどうかは、依存する反応的なデータソースが変更されたためです。この反応的なデータソースがヘルパーメソッドでアクセスされたか、またはテンプレートがリストアイテム(つまり、{{#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); 
     }; 
    }); 
    } 

EDIT

だから、あなたは、レンダリングカウントを見るためにあなたのクライアントコードの最後にこの関数を呼び出すことができます。ここにすべての変更をログに記録する検索カーソルをラップする方法がありますコンソールにカーソルを合わせます。私はちょうど私が反応型ビジョンと呼ばれる新しいパッケージのためにこれに似た機能を書いた。うまくいけばすぐにリリースされました。

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; 
}; 
+0

クールのMeteor 1.3適応し、より高度なバージョンで、これは非常に便利です。どのヘルパーが実際にテンプレートの再構築を生成したかを確認する方法はありますか? – Ricochet

+0

私の全体的な質問は、世界中のobserveChangesのようなものをオンにする方法があるかもしれないと思いますか?それぞれの検索で設定する必要はありません。 – Ricochet

+0

私はそれを行う方法について考える必要があります。あなたは創造的になる必要があります。 – cmather

0

アイデアのために@ cmatherありがとうございました。

彼女はlogRenders

// Log all rendered templates 
// If filter is set, only templates in filter will be logged 
// @params filter - name or names of template to filter 
logRenders = function logRenders (filter) { 
    for (name in Object(Template)){ 
    if (filter && !Array.isArray(filter)) filter = [filter]; 
    var template = Template[name]; 
    if (!template) continue; 
    if (filter && filter.indexOf(name) == -1){ 
     // Clear previous logRenders 
     if ('oldRender' in template) template.rendered = template.oldRender; 
     delete template.oldRender; 
     continue; 
    } 
    var t = function(name, template){ 
     if (!('oldRender' in template)) template.oldRender = template.rendered; 
     var counter = 0; 
     template.rendered = function() { 
     console.log(name, ++counter, this); 
     this.oldRender && this.oldRender.apply(this, arguments); 
     }; 
    }(name, template); 
    }; 
}; 
関連する問題