我正在尝试在Meteor中的聊天应用程序中构建一个活动/非活动指示器。为此,我需要跟踪每个用户在每个客户端上最近活动的时间。每当用户发送消息时,都会调用此行:
People.update({ name: login }, { $set: { activity: new Date() }});
我可以使用meteor mongo
命令查看数据库中的数据更改。在文件的另一部分,我有一些看起来像这样的代码:
Template.user_listing.people = function () {
return People.find();
}
在我的代码中,只有在People集合中添加或删除项目时才会调用此函数。第一个代码示例People.update(...)
不会引发反应,而且我的印象是它应该。我做错了什么?
答案 0 :(得分:0)
最好在问题或答案中避免使用x
和y
等变量。
将x
重命名为user_listing
。不应该看起来像这样,
Template.user_listing.people = function () {
return People.find();
}
现在你有了数据库游标,可以传递给模板中的#each
。
模板看起来像这样,
<template name="user_listing">
{{#each people}}
Who: {{name}}
Recent activity: {{activity}}
{{/each}}
</template>
假设你有,
People = new Meteor.Collection('people'); // or whatever your collection name is
http://docs.meteor.com/#templates有一个例子。验证。
答案 1 :(得分:0)
Meteor有&#39;部分&#39;这是反应性的。这意味着每当反应源发生变化时,计算(使用该反应源的每个其他变量和函数)都会刷新(重新运行)。 您可以使用订阅人员集合来实现您所描述的内容。订阅是被动的。当您更改人员文档时,更改也将推送到客户端,并且由于订阅是被动的,因此您的模板将使用新内容进行更新...
TLDR:为了在前端自动接收数据库更新,您需要删除自动发布包并使用发布和订阅,就像我正在做的一样。
// client js
Template.user_listing.onCreated(function () {
this.subscribe('people');
});
Template.user_listing.helpers({
getPeople: function () {
return People.find();
}
});
// then, when a user sends a message you trigger the update
People.update({ name: login }, { $set: { activity: new Date() }});
// and in your html template
<template name="user_listing">
{{#each people}}
Who: {{name}}
Recent activity: {{activity}}
{{/each}}
</template>
// server
Meteor.publish('people', function () {
return People.find();
});
// on both server and client
People = new Meteor.Collection('people');
阅读有关发布和订阅的更多信息,并按照示例进行操作: https://www.meteor.com/tutorials/blaze/publish-and-subscribe