Javascript Meteor:在collectionHandle.ready()为true后,如何触发helper函数的重新运行
这是我的旧版本的新版本: 多亏了汤姆·科尔曼的帮助,我终于想出了如何正确地检查订阅是否准备就绪()的方法 我当前的代码结构如下所示:Javascript Meteor:在collectionHandle.ready()为true后,如何触发helper函数的重新运行,javascript,collections,meteor,publish-subscribe,Javascript,Collections,Meteor,Publish Subscribe,这是我的旧版本的新版本: 多亏了汤姆·科尔曼的帮助,我终于想出了如何正确地检查订阅是否准备就绪()的方法 我当前的代码结构如下所示: /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() {
/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'));
});
});
// ...
然后,我在一个名为:
/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;
}
}
/client/views/
-->.js:
Template.x.dataLoaded=函数(){
if(Session.get('ehash'))
if(eventsHandle&&groupsHandle&&eventsHandle.ready()&&groupsHandle.ready()){
log('All data loaded!');
singleevent=Events.find({ehash:Session.get('ehash')}).fetch()[0];
返回true;
}
}
当dataLoaded
返回true或显示加载微调器时,此帮助程序基本上将所有内容包装在相应的模板中,并显示内容
问题是,在许多情况下,这不起作用,因为这个数据加载的代码只运行一次。因此,如果在运行dataLoaded时这两个句柄尚未就绪(),则内容将永远不会显示。在本例中,我仍然可以看到所有console.log都来自app.js文件(Deps.autorun()的内容),但是日志“all data load!”从未被回显
所以我的问题是:如何触发此代码的重新运行,以便再次运行dataLoaded
,以便最终显示内容
非常感谢调用eventHandle的ready()
方法,您需要括号,否则我想您只是在检查ready方法是否存在。关于这一点的讨论非常重要
如果在javascript的不同部分将eventHandle
设置为不同的订阅句柄,这可能仍然会给您带来问题。尝试按所述构造应用程序的文件。是的,您需要手动调用this.ready()
。请参阅。只需创建依赖项即可解决此问题:
var _dep = new Deps.Dependency();
Template.x.dataLoaded = function() {
_dep.depend();
...
}
function handler() {
... do.stuff();
_dep.changed();
}
现在,每次运行\u dep.changed()
方法时,助手都将重新运行。简单 这看起来比需要的更复杂。我很可能遗漏了什么,但在我看来,您只是试图在加载数据时设置加载微调器。我发布了一个简单易读的方法。你在哪里托管应用程序?现在是localhost。你为什么这么问?因为Heroku在Chrome上对我来说有点怪异。@Sean Yang-Patrick,你能分享一下你的代码结构吗?我想知道这是否与你放置dataReady函数的位置有关。刚刚用这些东西编辑了一下,请看一下!谢谢你把括号弄清楚了!关于结构:我试着把我所有的订阅放在整个meteor项目的一个Deps.autorun()中(这就是你的意思,对吧?!)。问题是我无法访问特定于视图的.js文件中的句柄(->client/views/谢谢你的回答!出于某种原因,当我通过Cmd+L(跳入url栏)+Enter在页面上重新加载时,这会有所帮助。(就像再次键入相同的url并加载一样).但是如果我通过Cmd+R重新加载,我最终会出现如下错误:您以前做得更好:IF(eventsHandle&&groupsHandle&&eventsHandle.ready()&&groupsHandle.ready())
。为什么标准处理程序不能解决这个问题?这不是我们拥有它们的原因吗?我已经尝试过这种方法,但由于某些原因它无法正常工作。也许我做错了什么,明天再尝试!我会随时通知你的!:)