6

这是我的旧问题的新版本:

因此,感谢汤姆科尔曼的帮助,我终于弄清楚了如何正确检查订阅是否准备就绪()。

我当前的代码结构如下所示:

/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再次运行以便最终显示内容?

此致

4

4 回答 4

8

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

var _dep = new Deps.Dependency();

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


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

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

于 2013-08-13T18:13:49.993 回答
0

要调用您需要括号的ready()方法,eventHandle否则我认为您只是在检查准备好的方法是否存在。讨论这个是here

eventHandle如果在您的 javascript 的不同部分设置为各种订阅句柄,这可能仍然会给您带来问题。尝试按照此处所述构建应用程序的文件。

于 2013-08-10T12:38:35.677 回答
0

是的,您需要this.ready()手动调用。请参阅文档中的示例

于 2013-08-13T06:37:32.353 回答
0

这看起来比它需要的更复杂。我很可能遗漏了一些东西,但在我看来,你只是想在加载数据时设置一个加载微调器。我已经发布了一种在 Meteor 中显示“正在加载”的简单、更易读的方式。

于 2013-08-14T19:26:02.117 回答