【问题标题】:Meteor how to synchronize Client session variable with Server data流星如何将客户端会话变量与服务器数据同步
【发布时间】:2015-05-29 10:33:46
【问题描述】:

我有一些数据通过 Session.set(...) 存储在客户端(然后呈现到模板中)。

这些数据是动态变化的......在服务器端,我如何同步它,所以客户端会在服务器上的数据发生变化时更新模板?最好的方法是发布/订阅,但它是为与数据库一起使用而设计的。

这就是我目前为止的结果:

if (Meteor.isClient) {

  Session.setDefault('dynamicArray', [{text: "item1"},{text: "item2"}]);
  Template.body.helpers({
    dynamicData: function(){
      return Session.get('dynamicArray');
    }
  });

  // place for code to sync dynamicArray with server

}

if (Meteor.isServer) {

  Meteor.startup(function () {
    var dynamicArray = [{text: "item3"},{text: "item4"},{text: "item5"}];

    // place for code to publish dynamicArray for client

  });
}

【问题讨论】:

  • 发布和订阅不是为数据库游标设计的,恰恰相反:游标针对发布和订阅进行了优化。您仍然可以将 Pub/Sub API 用于任何类型的 EJSON 数据。
  • 好的,所以我发现游标是由适用于 Mongo.Collection 的 .find() 方法返回的,所以为了创建游标,我需要先创建数据库集合,或者我哪里错了?

标签: ajax meteor synchronization publish-subscribe


【解决方案1】:

关于您的评论,您需要首先创建一个位于 .isClient 和 .isServer 条件之外的 DynamicData 集合。从那里,.find() 将允许您以游标的形式从服务器收集数据,可以使用 {{#each dynamicData}} 进行迭代。您可以如何设置集合和帮助程序的示例如下:

DynamicData = new Collection('dynamicData'); //Sets up new Collection

if (Meteor.isClient) {

  Template.body.helpers({
    dynamicData: function(){
      return DynamicData.find({}, {fields: {dynamicArray: [item1, item2, item3]})
    }
  });

}

当然,这取决于您检索的文档的结构以及您使用它们的目的。例如,如果您只想返回一个 dynamicArray,您最好使用:

return DynamicData.findOne({}, {fields: {dynamicArray: [item1, item2, item3]}).dynamicArray;

...因为这将直接返回数组 [item1, item2, item3]。这似乎是您正在寻找的,因为我使用相同的方法来替换最初过度依赖会话数据来同步信息。相反,关键点是让 服务器 信息通过帮助程序 提供给客户端,这将绕过通过会话数据同步的需要。希望这会有所帮助。

【讨论】:

  • 谢谢,例如,我会检查这个,但我希望在不使用 mongo 集合的情况下会有一些解决方案;)。在我的情况下,每个用户的动态数据都会不同,所以我可能需要为每个用户 id i 数据库添加动态数据。顺便说一句,我找到了另一个解决方案,可能是 Meteor.Stream meteorhacks.com/introducing-meteor-streams
  • 我明白了。感谢您的提醒——我认为 Meteor.Stream 更适合您的用例,因为它似乎在客户端之间传输数据,而不是在服务器之间传输数据。在任何情况下,以上内容都是针对电子菜单的,它解释了数据库保存信息的必要性。如果您的用例更加短暂(例如聊天应用程序),我可以看到 Stream 适合您。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-11-04
  • 2012-04-21
  • 1970-01-01
  • 1970-01-01
  • 2015-09-24
  • 2015-10-22
相关资源
最近更新 更多