【问题标题】:MeteorJS - Watch for server variable change and update the template valueMeteorJS - 监视服务器变量更改并更新模板值
【发布时间】:2023-03-31 16:20:01
【问题描述】:

我有一个疑问。不确定是否可行,也没有找到明确的答案。

是否可以向服务器变量添加“观察者”,以便在值更改时,我可以更新视图(客户端)?

假设我有一个var counter = 0 和一个超时函数,它每分钟更新一次计数器变量。

我想在客户端更新<span>{{counter}}</span>。我需要向这个服务器变量添加一个“观察者”并使其反应。

提前致谢!

【问题讨论】:

  • 看看Tracker.autorun。将变量放入 Session 并让 Tracker “监视”它。

标签: meteor reactive-programming


【解决方案1】:

执行此操作的正确方法是创建一个集合并将该变量存储在集合中(即使这意味着您有一个包含一个文档的集合)。

关于服务器/客户端通用代码:

Counter = new Mongo.Collection("counter");

在客户端做一个助手:

Template.myTemplate.helpers({
  counter: function () {
    return Counter.findOne();
  }
});

在服务器上确保有一个计数器:

if (Counter.find().count() === 0) {
  Counter.insert({value: 0});
}

然后,在服务器上增加计数器:

Counter.update({}, {$inc: {value: 1}});

如果您想跟踪多个计数器,可以使用类似的方法 - 只需将多个计数器插入到集合中并通过 _id 字段引用它们。

【讨论】:

  • 感谢 stubailo,我已经阅读了更多内容,听起来像是解决方案。一旦我的测试成功,我将标记为已回答。
  • 成功了!谢谢。我已将 Meteor.bindEnvironment 添加到包装 Counter.update 的回调中以保持同步。
  • 这不是不必要且浪费地将集合持久化到数据库吗?我有同样的问题,但我不想/不需要将它保存到数据库中。
【解决方案2】:

如果您的var counter = 0 是服务器端代码,它不会发送给客户端。 您想要推送到客户端的任何服务器端数据都应该在 Meteor 集合中。然后您使用典型的发布和订阅向客户端发送更新。

如果您将counter 设为会话变量,即Session.set('counter', counter++),那么它将仅存在于客户端。不同的客户端不会有counter的同步值

【讨论】:

    猜你喜欢
    • 2013-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-22
    • 2018-09-10
    • 2014-01-24
    相关资源
    最近更新 更多