我最初认为我的集合没有接收数据,但事实证明我只是在我的查询中有一个错字。但我的数据仍然没有显示在屏幕上。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好运汤姆