MeteorJS 模板不显示数据,不出现
MeteorJS template not showing data, not appearing
我原本以为我的 collection 没有收到数据,但事实证明我的查询中有错字。但是我的数据仍然没有出现在屏幕上。 HTML 模板非常基础,这里是:
<template name="messages" class=".messages">
{{#each showMessages}}
<blockquote>
<p>{{message}}</p>
</blockquote>
{{/each}}
</template>
它应该只是让 collection 的消息在我调用 {{> 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数据模型的误解
虽然可以使用方法调用发送数据,但通常您会希望使用 publications and subscriptions 将数据发送到客户端。这些具有几乎神奇的 属性 查询 实时 - 也就是说,对查询的任何更新都将自动发送到客户端。您拥有的当前代码如果能正常工作,将不会有实时数据。具体问题是 Meteor.call
是异步的,因此您的消息助手将看不到任何内容。
相反,这就是您想要做的。在服务器上,您将设置消息集合的 publication:
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。它只是标识基础数据库中的集合。
调用方法是异步的,因此在助手中返回结果不会有任何好处。
同样,fetch 也不是被动的。
showMessages: function(){
return Messages.find({},{sort:{timestamp:-1}, limit: 20});
}
在制作您自己的项目之前,请继续阅读发现流星。我完全赞成努力自学一些新东西,但是坚实的基础会创造奇迹并消除很多挫折感。
我已经为那些开始的问题准备了一些MeteorPad。您可能会在这里找到一些初步说明
http://meteorpad.com/pad/Ba5DTe94NjFi3ZTPA/Playground_Flow-Router_Chat
祝你好运
汤姆
我原本以为我的 collection 没有收到数据,但事实证明我的查询中有错字。但是我的数据仍然没有出现在屏幕上。 HTML 模板非常基础,这里是:
<template name="messages" class=".messages">
{{#each showMessages}}
<blockquote>
<p>{{message}}</p>
</blockquote>
{{/each}}
</template>
它应该只是让 collection 的消息在我调用 {{> 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数据模型的误解
虽然可以使用方法调用发送数据,但通常您会希望使用 publications and subscriptions 将数据发送到客户端。这些具有几乎神奇的 属性 查询 实时 - 也就是说,对查询的任何更新都将自动发送到客户端。您拥有的当前代码如果能正常工作,将不会有实时数据。具体问题是 Meteor.call
是异步的,因此您的消息助手将看不到任何内容。
相反,这就是您想要做的。在服务器上,您将设置消息集合的 publication:
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。它只是标识基础数据库中的集合。
调用方法是异步的,因此在助手中返回结果不会有任何好处。 同样,fetch 也不是被动的。
showMessages: function(){
return Messages.find({},{sort:{timestamp:-1}, limit: 20});
}
在制作您自己的项目之前,请继续阅读发现流星。我完全赞成努力自学一些新东西,但是坚实的基础会创造奇迹并消除很多挫折感。
我已经为那些开始的问题准备了一些MeteorPad。您可能会在这里找到一些初步说明
http://meteorpad.com/pad/Ba5DTe94NjFi3ZTPA/Playground_Flow-Router_Chat
祝你好运 汤姆