Meteor:如何在collectionHandle.ready()为true后触发辅助函数的重新运行

时间:2013-08-09 20:49:23

标签: javascript collections meteor publish-subscribe

这是旧版question的新版本:

感谢汤姆科尔曼的帮助,我终于想出了如何正确检查订阅是否准备就绪(

)。

我目前的代码结构如下:

/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()的东西)但日志&#34;所有数据都加载了!&#34;永远不会回首。

所以我的问题是:如何触发重新运行此代码,以便再次运行dataLoaded,以便最终显示内容?

最好的问候

4 个答案:

答案 0 :(得分:8)

只需创建一个依赖项即可解决问题:

var _dep = new Deps.Dependency();

Template.x.dataLoaded = function() {
    _dep.depend();
    ...
}


function handler() {
    ... do.stuff();
    _dep.changed();
}

现在,每次运行_dep.changed()方法时,帮助程序都会重新运行。简单!

答案 1 :(得分:0)

要调用ready()的{​​{1}}方法,您需要使用括号,否则我认为您只是检查ready方法是否存在。对此的讨论是here

如果将eventHandle设置为javascript不同部分的各种订阅句柄,这可能会让您遇到问题。尝试按照here所述构建应用文件。

答案 2 :(得分:0)

是的,您需要手动拨打this.ready()。请参阅the example in documentation

答案 3 :(得分:0)

这看起来比它需要的更复杂。我很可能错过了一些东西,但在我看来,你只是在加载数据时尝试设置加载微调器。我发布了一种简单,更易读的showing "loading" in Meteor方式。