MeteorJS模板没有显示数据,没有出现

时间:2015-07-23 19:03:23

标签: javascript html mongodb web-applications meteor

我原本以为我的收藏品没有收到数据,但事实证明我的查询中只有一个拼写错误。但我的数据仍然没有出现在屏幕上。 HTML模板非常基础,在这里:

<template name="messages" class=".messages">
        {{#each showMessages}}
            <blockquote>
                <p>{{message}}</p>
            </blockquote>
        {{/each}}
</template>

当我致电{{&gt;}时,它应该只显示消息的集合。消息}} 这是与之对应的客户端JS:

Meteor.subscribe("Messages");
    Template.messages.helpers({
        showMessages: function(){
            return Meteor.call("find");
        }
    });

以及服务器方法:

Meteor.methods({
      insert:function(username, message){
          var id = Messages.insert({
              'message': message,
              'user': Meteor.userId(),
              'username': username,
              'timestamp': new Date()
          });

          return "success";
      },
      'find': function(){
            return Messages.find({},{sort:{timestamp:-1}}, 20).fetch();
      }
  });

我对MeteorJS很陌生,我昨天刚拿起它,所以它可能是我缺少的基本功能,但是我已经对这个问题猛烈抨击了2个小时并取得了0的进步。我没有启用不安全或自动发布。这不是一个有用的产品或任何东西,我用它来教自己,所以我知道我做了一些不安全的事情。

3 个答案:

答案 0 :(得分:2)

在这种情况下,主要是对Meteor数据模型的误解。

虽然可以使用方法调用发送数据,但通常您希望使用publications and subscriptions将数据发送到客户端。这些具有几乎神奇的属性,查询实时 - 也就是说,查询的任何更新都将自动发送到客户端。您拥有的当前代码如果正常工作,则不会有实时数据。具体问题是Meteor.call是异步的,因此您的消息帮助者不会看到任何内容。

相反,这就是你想要做的事情。在服务器上,您将设置messages集合的发布

Meteor.publish("someWeirdName", function() {
  return Messages.find({},{ sort: { timestamp:-1}, limit: 20});
});

请注意与代码的不同之处:没有fetch(),因为我们需要一个实时光标,而20可能就是您想要的限制选项。请注意,我也称之为someWeirdName,因为这是发布的名称,而不是您将用于在客户端上订阅的集合。有关更详细的说明,您可能需要查看this post

然后,在客户端上,您只需要以下内容:

Meteor.subscribe("someWeirdName");

Template.messages.helpers({
    showMessages: function(){
        return Messages.find();
    }
});

请注意,之前调用的Meteor.subscribe("Messages")无效,因为没有名为Messages的发布。此外,我们将使用客户端消息缓存创建一个光标来显示消息。

此外,所有这些代码都要求您在服务器和客户端上声明以下内容:

Messages = new Mongo.Collection("callMeWhateverYouWant");

另请注意,用于实例化此集合的参数与您在代码中引用集合的方式无关,除非您正在编写custom publication。它只是标识底层数据库中的集合。

答案 1 :(得分:0)

调用方法是异步的,因此将结果返回给帮助程序不会有任何好处。 同样,获取也不是被动的。

showMessages: function(){
  return Messages.find({},{sort:{timestamp:-1}, limit: 20});
}

继续&amp;在创建自己的项目之前阅读发现流星。我都在努力为自己教一些新东西,但一个坚实的基础将会创造奇迹和消除了很多挫折感。

答案 2 :(得分:0)

我为那些开始的问题准备了一些MeteorPad。您可以在这里找到一些初步说明

http://meteorpad.com/pad/Ba5DTe94NjFi3ZTPA/Playground_Flow-Router_Chat

祝你好运 汤姆