MeteorJS模板不显示数据,不出现



我最初认为我的集合没有接收数据,但事实证明我只是在我的查询中有一个错字。但我的数据仍然没有显示在屏幕上。HTML模板是非常基本的,它是:

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

当我调用{{> messages}}时,它应该只是使消息集合出现以下是与之对应的客户端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进展。我没有启用不安全或自动发布。这不是一个可用的产品,我用它来教自己,所以我知道我在做一些不安全的事情。

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

虽然可以使用方法调用发送数据,但通常您希望使用发布和订阅向客户端发送数据。这些查询几乎具有神奇的属性,即查询是活动的—也就是说,对查询的任何更新都将自动发送到客户端。你现在拥有的代码,如果能正常工作,就不会有实时数据。具体的问题是Meteor.call是异步的,因此您的消息助手将看不到任何内容。

相反,这是你想要做的。在服务器上,您将设置消息集合的发布:

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

请注意与您的代码的区别:没有fetch(),因为我们想要一个活动游标,而20可能是您想要作为限制选项的。注意,我还将其称为someWeirdName,因为这是发布的名称,而不是将用于在客户机上订阅的集合的名称。要了解更详细的解释,您可能想要查看这篇文章。

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

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

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

此外,所有这些代码都要求您在服务器和客户端上声明以下内容:
Messages = new Mongo.Collection("callMeWhateverYouWant");

还请注意,用于实例化此集合的参数与您在代码中如何引用该集合无关,除非您正在编写自定义发布。它只是标识底层数据库中的集合。

调用方法是异步的,因此在帮助器中返回结果不会有任何好处。同样,fetch也不是响应式的。

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

继续&在制作自己的项目之前,请阅读发现流星。我完全赞成努力自学一些新东西,但坚实的基础会创造奇迹。消除很多挫败感。

我为这些开始的问题准备了一些MeteorPad。你可以在这里找到一些初始指令

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

好运汤姆

最新更新