收集更新不会触发Meteor中的反应

时间:2012-08-26 00:05:22

标签: meteor

我正在尝试在Meteor中的聊天应用程序中构建一个活动/非活动指示器。为此,我需要跟踪每个用户在每个客户端上最近活动的时间。每当用户发送消息时,都会调用此行:

People.update({ name: login }, { $set: { activity: new Date() }});

我可以使用meteor mongo命令查看数据库中的数据更改。在文件的另一部分,我有一些看起来像这样的代码:

Template.user_listing.people = function () {
  return People.find();
}

在我的代码中,只有在People集合中添加或删除项目时才会调用此函数。第一个代码示例People.update(...)不会引发反应,而且我的印象是它应该。我做错了什么?

2 个答案:

答案 0 :(得分:0)

最好在问题或答案中避免使用xy等变量。

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