Pat*_*der 6 javascript collections publish-subscribe meteor
这是我旧问题的新版本:
所以,多亏Tom Coleman的帮助,我终于想出了如何正确检查订阅是否准备就绪().
我目前的代码结构如下所示:
/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'));
});
});
// ...
Run Code Online (Sandbox Code Playgroud)
然后我查看了名为的文件夹中所有模板内容的特定.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;
}
}
Run Code Online (Sandbox Code Playgroud)
这个帮助器dataLoaded
基本上包装了相应模板中的所有内容,并在dataLoaded
返回true 时显示内容,或者显示加载微调器.
问题是在许多情况下这不起作用,因为这个dataLoaded代码只运行一次.因此,如果在运行dataLoaded时两个句柄未就绪(),则内容将永远不会显示.在这种情况下,我仍然看到所有的console.log来自app.js文件(Deps.autorun()的东西),但日志"所有数据已加载!" 永远不会回首.
所以我的问题是:如何触发重新运行此代码,以便dataLoaded
再次运行,以便最终显示内容?
最好的祝福
只需创建依赖项即可解决问题:
var _dep = new Deps.Dependency();
Template.x.dataLoaded = function() {
_dep.depend();
...
}
function handler() {
... do.stuff();
_dep.changed();
}
Run Code Online (Sandbox Code Playgroud)
现在,每次运行_dep.changed()
方法时,帮助程序都会重新运行.简单!
归档时间: |
|
查看次数: |
3786 次 |
最近记录: |