これは私の古い質問の新しいバージョンです:
Tom Coleman の助けのおかげで、サブスクリプションが ready() かどうかを適切にチェックする方法を最終的に見つけました。
私の現在のコード構造は次のようになります。
/client/app.js:
eventsHandle = null;
groupsHandle = null;
// ...
// First Deps.autorun():
// Does not depend on any Session var, should just run every time
Deps.autorun(function() {
eventsHandle = Meteor.subscribe("events", function() {
console.log('Deps.autorun(): Events loaded');
});
});
// Second Deps.autorun():
// contains all subscriptions which are dependent on my Session var "ehash"
Deps.autorun(function() {
if(Session.get('ehash'))
groupsHandle = Meteor.subscribe("groups", Session.get('ehash'), function() {
console.log('Deps.autorun(): Groups loaded with ehash: ' + Session.get('ehash'));
});
});
// ...
次に、次のフォルダー内のすべてのテンプレート用の特定の .js および .html ファイルを表示します。
/client/views/
--> <page>.js:
Template.x.dataLoaded = function() {
if(Session.get('ehash'))
if(eventsHandle && groupsHandle && eventsHandle.ready() && groupsHandle.ready()) {
console.log('All data loaded!');
singleevent = Events.find({ehash: Session.get('ehash')}).fetch()[0];
return true;
}
}
このヘルパーdataLoaded
は、基本的にすべてを対応するテンプレートにラップし、dataLoaded
true が返されたときにコンテンツを表示するか、ローディング スピナーを表示します。
問題は、この dataLoaded コードが 1 回しか実行されないため、多くの場合、これが機能しないことです。そのため、dataLoaded の実行時に 2 つのハンドルが ready() でない場合、コンテンツは決して表示されません。この場合、app.js ファイル (Deps.autorun() のもの) からのすべての console.log が引き続き表示されますが、「すべてのデータがロードされました!」というログが表示されます。エコーされることはありません。
だから私の質問は次のとおりです:このコードの再実行をトリガーして再dataLoaded
実行して、コンテンツが最終的に表示されるようにするにはどうすればよいですか?
よろしくお願いします