这是我的旧问题的新版本:
因此,感谢汤姆科尔曼的帮助,我终于弄清楚了如何正确检查订阅是否准备就绪()。
我当前的代码结构如下所示:
/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 代码只运行一次。因此,如果在运行 dataLoaded 时两个句柄未准备好(),则内容将永远不会出现。在这种情况下,我仍然看到所有 console.log 都来自 app.js 文件(Deps.autorun() 的东西),但日志“加载了所有数据!” 从来没有回声。
所以我的问题是:如何触发此代码的重新运行,以便dataLoaded
再次运行以便最终显示内容?
此致