MeteorJS ReactiveVar与数据库数据



很明显,我对ReactiveVar做了一些错误的事情,因为我无法使它按预期工作。

我试图通过调用Meteor.call方法来设置ReactiveVar的值,该方法返回用户名列表。但当应用程序的另一部分更改用户名时,它不会更新。

我两种都试过了:

Template.qastatistics.created = function () {
  this.trackUsernames = new ReactiveVar(false);
  var instance = Template.instance();
  Meteor.call('trackUsernames', function (err, data) {
    instance.trackUsernames.set(data);
  });
};

和:

Template.qastatistics.helpers({
  users: function () {
  var usernames,
  instance = Template.instance();
  if (instance.trackUsernames.get() === false) {
    Meteor.call('trackUsernames', function (err, data) {
      instance.trackUsernames.set(data);
    });
  }
  usernames = instance.trackUsernames.get();
  ...

但当数据库中的用户名发生变化时,两者都不会更新用户名列表。

这在ReactiveVars中可能吗?还是我完全误解了它们?

编辑:我提到的用户名不是来自Meteor.users集合,而是来自另一个包含用户名的集合的不同调用。

首先,我将使用onCreated函数,而不是定义created。这是一个更可扩展的,它是新的API。created只是为了向后兼容性而保留的。

关于你的问题。你是对的,你似乎误解了ReactiveVar的作用。它们是被动的数据源。这意味着,当您在某些Tracker.autorun(也称为反应式计算(中调用myReactiveVar.get时,无论何时调用myReactiveVar.set,计算都将重新运行。

你把第一部分说对了。空格键辅助对象始终在自己的计算中运行。您的错误是认为方法调用是一个反应性操作。这意味着,您可以调用trackUsernames并再次设置trackUsernames ReativeVar,模板中的值将自行更新。但是一个方法只运行一次。它对反应性没有任何幻想。

方法调用只传输一次数据。另一方面,当您发布一组文档(像所有用户一样(时,它们将动态更新。每当该组已发布文档中发生更改时,都会将其同步到客户端因此,一般来说,最好使用发布和订阅来被动同步数据。如果你想用一种方法做同样的事情,你需要做一些民意调查(所以你又回到了石器时代(。

实现您正在尝试做的事情的最简单方法是使用Meteor.users.find().fetch()。正如文档中所说,fetch为您正在获取的所有文档注册依赖关系,如果它是从反应式计算中调用的。

首先,您需要正确设置您的发布,以便用户可以看到其他用户的用户名。我把这个留给你。然后你需要重新实现你的助手

Template.qastatistics.helpers({
  users: function () {
    var usernames = _.pluck(Meteor.users.find().fetch(), 'username');
...

感谢@kyll的建议,我通过发布我需要的数据来获得我想要的:

服务器:

cope.publish.usernamesID = Random.id();
Meteor.publish("itemsusernames", function () {
    self = this;
    var initializing = true;
    var handle = Items.find().observeChanges({
        added: function (id) {
            !initializing && self.changed(
                "itemsusernames",
                cope.publish.usernamesID, 
                Items.distinct("p4User"));
        },
        changed: function (id) {
            !initializing && self.changed(
                "itemsusernames",
                cope.publish.usernamesID, 
                Items.distinct("p4User"));
        },
        removed: function (id) {
            !initializing && self.changed(
                "itemsusernames",
                cope.publish.usernamesID, 
                Items.distinct("p4User"));
        }
    });
    initializing = false;
    self.added("itemsusernames", cope.publish.usernamesID, Items.distinct("p4User"));
    self.ready();
    self.onStop(function () {
        handle.stop();
    });
});

客户端:

users: function () {
    var usernames = [],
        oUsernames = ItemsUsernames.find().fetch();
    if (!oUsernames[0]) return [];
    usernames = $.map(oUsernames[0], function (value, index) {
        if (!isNaN(index)) {
            return [value];
        }
    });
    ...

当然:ItemsUsernames = new Mongo.Collection("itemsusernames");

最新更新