1

我的流星目录由 2 个文件组成:

社会.js:

Messages = new Meteor.Collection("messages");

if (Meteor.isServer) {
}

if (Meteor.isClient) {
    Template.temple.messages = function() {
        return Messages.find();  
    };

    Meteor.startup(function () {
            console.log('console startup: ' + Messages.find().count());
    });

    console.log('console normal: ' + Messages.find().count());

    var ali = function() {
        console.log('console normal: ' + Messages.find().count());
    };

    setTimeout(function() {
        console.log('console normal: ' + Messages.find().count());
    }, 2000);
    // The callback function is not called on the following line:
    Meteor.subscribe('messages',function(){alert('ALERT!');});
}

社会.html:

<head>
<title>naber</title>
</head>

<body>
{{> temple}}
</body>

<template name = "temple">
{{#each messages}}
{{message}} <br />
{{/each}}
</template>

该集合仅在经过一段时间后才完全加载。如果我环绕一个setTimeout. 在数据库真正完全可用后,我能做些什么来确保我的功能被执行?

4

3 回答 3

2

Meteor.subscribe(NAME)Meteor.publish(NAME). 您的代码尝试订阅名为的"messages"内容,但您没有发布具有该名称的内容。

您正在获取数据的事实表明您正在使用默认autopublish包(请参阅.meteor/packages查看),这意味着您不必显式发布或订阅数据。不幸的是,当自动发布的数据准备好(这可能应该修复)时,没有办法获得回调。所以如果你想这样做,你会想要meteor remove autopublish并使用Meteor.publish来发布你想要发布的数据;然后,您实际上可以使用Meteor.subscribe回调。

于 2013-01-28T22:33:25.760 回答
1

我通常会显示一个加载指示器,直到订阅加载完毕。看这个例子:Meteorjs loading message

从服务器端发布集合:

if (Meteor.isServer) {
  Meteor.publish("messages", function () {
    return Messages.find(); // everything
  );
}
于 2013-01-26T02:15:53.720 回答
1

由于 Meteor 中反应性的工作方式,您始终需要针对服务器尚未将数据发送到客户端的位置设计应用程序状态。您可以将此称为“加载”状态。

Template声明中,您必须始终检查您依赖的数据是否可用。如果模板确实依赖于数据,则希望它首先呈现为空,然后在数据到达时进行更新,因为数据是一个反应式数据源。

使用您自己的函数,最好以它们也依赖于反应式数据源的方式编写它们,并使用类似Meteor.autorun的方法确保在此类数据源更改时重新执行它们。

总是把你想在页面加载后运行的代码放在里面Meteor.startup,否则当你的代码执行时你甚至可能没有 Meteor 可用。

以下是我将如何重写您的代码:

Messages = new Meteor.Collection("messages");
if (Meteor.isClient){
  Meteor.startup(function() {
    // anything you need to do, like subscriptions 
  });
  Template.temple.loading = function() {
    return Messages.find().count === 0 ? "Loading..." : "";
  }
  Template.temple.messages = function() {
    var messages = Messages.find();
    if (messages.count() > 0) return messages;
  }
}

<template name="messages">
  {{loading}}
  {{#each messages}}
    {{message}}<br>
  {{/messages}}
</template>

Meteor.subscribe如果您只是在客户端上使用,则实际上不需要调用消息Messages.find()

于 2013-01-26T14:54:48.743 回答