Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/396.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Meteor:在collectionHandle.ready()为true后,如何触发helper函数的重新运行_Javascript_Collections_Meteor_Publish Subscribe - Fatal编程技术网

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())
。为什么标准处理程序不能解决这个问题?这不是我们拥有它们的原因吗?我已经尝试过这种方法,但由于某些原因它无法正常工作。也许我做错了什么,明天再尝试!我会随时通知你的!:)