関連するすべてのコメントが見つかるまで、各コメント/サブコメントで再帰的に繰り返される、トピック、25 のコメント、およびコメントごとに最大 5 つのサブコメントをロードしたいと考えています。
現在、角度ディレクティブを使用して、コメントに子が含まれるたびに再帰的にサブスクライブしてローカル コレクションに追加しています。これは非常にうまく機能しますが、最初の 25 個のコメントをロードしてから、その子をロードし、次にその子などをロードするまでに (予想されるように) 多少の遅延があります。
この問題は、一度にページをロードするだけであれば問題ありません。無限スクロールを使用し、最初の 25 コメント制限を増やすと問題になります。サブコメントが消え、再度読み込まれると再び表示されるため、ページが少し上下にジャンプします。
ローカル クライアントに送信する前にすべてのコメントを再帰的に検索する方法を考えていたので、トピックごとに複数回の往復を行う必要はありません。
ck-gaming.comでデモをロードしました
一番下までスクロールすると、さらに読み込まれ、サブコメントがページに再読み込みされると、ジャンプするのがわかります。
私が考えることができる 2 つのオプションは、解決を使用してページをロードする前にすべてのコレクションを待機するか、再帰的な発行を使用して最初にすべてを取得することです。
考え?アイデア?
わかりました、できれば考えてみたい最初の試みです。
パブリッシングについては、同じコレクションからのパブリッシュをより簡単にするために、 publish-compositeを使用することにしました。
私が書いた出版物のために:
Meteor.publishComposite('oneDiscussion', function (slug, options) {
var query = {};
query.find = function () {
return Discussions.find({ slug: slug }, { limit: 1 });
};
var mainChildQuery = Comments.find({ slug: slug }, { limit: 1 });
query.children = [];
query.children[0] = {};
query.children[0].find = function (discussion) {
return mainChildQuery;
};
query.children[0].children = [];
query.children[0].children[0] = {};
query.children[0].children[0].find = function (comment) {
return Meteor.users.find({ _id: comment.author.id }, { limit: 1, fields: { profile: 1, roles: 1, createdAt: 1, username: 1 } });
};
query.children[0].children[1] = {};
query.children[0].children[1].find = function (parent) {
Counts.publish(this, 'numberOfComments', Comments.find(
{ parent_id: parent._id }
), { noReady: true });
console.log(options)
return Comments.find({ parent_id: parent._id }, options);
};
// var parentQuery = Comments.find({ slug: slug });
var parent = mainChildQuery.fetch();
var children = Comments.find({ parent_id: parent[0]._id }, { limit: 25 }).fetch();
var childrenIds = _.pluck(children, '_id');
var getChildren = function (children_ids, thisParent) {
var i = 0;
thisParent.children = [];
var recursive = function getEm(children, parent) {
_.each(children, function (id) {
// parent.children[i] = new Children(id);
var query = Comments.find({ parent_id: id }, { limit: 5, sort: { date: -1 } });
parent.children[i] = {
find: function () {
return Comments.find({ parent_id: id }, { limit: 5, sort: { date: -1 } });
}
};
var children1 = query.fetch();
var newChildrenIds = _.pluck(children1, '_id');
i++;
if (newChildrenIds.length > 0) {
getEm(newChildrenIds, parent);
}
});
}
recursive(children_ids, thisParent);
};
getChildren(childrenIds, query.children[0].children[1]);
return query;
});
これまでのところ問題なく動作しているようですが、デスクトップで実行すると、思ったほどパフォーマンスが高くありません。展開して、オンラインで違いがあるかどうかを確認します。家に帰ってライブサイトを更新できたら更新します。誰かが私が書いたものに何か問題を見つけることができれば、それは大歓迎です.