2015-05-29 91 views
0

我有一些数据存储在客户端的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 

    }); 
} 
+0

发布和订阅不是为数据库游标设计的,它恰恰相反:游标经过优化,可用于发布和订阅。您仍然可以将[Pub/Sub API](http://docs.meteor.com/#/full/publishandsubscribe)与任何类型的EJSON数据一起使用。 –

+0

好吧,所以我发现游标是由.find()方法返回的,它在Mongo.Collection的方法上工作,所以为了创建游标,我需要先创建数据库集合,或者我错了某处? –

回答

1

关于你的评论,您需要先克雷娅察一个DynamicData集合,位于.isClient和.isServer条件语句之外。从那里,.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]}) 
    } 
    }); 

} 

当然,这依赖于文件(S)要检索的结构以及你正在使用他们的东西。举例来说,如果你只希望返回一个dynamicArray您使用可能会更好:

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

...因为这将返回数组[项目1,项目2,项目3]直接。这似乎是你正在寻找的,因为我已经使用相同的方法来取代初始过度依赖会话数据来同步信息。相反,关键是要让服务器信息可供客户端助手使用,这将避开需要通过会话数据进行同步。希望这可以帮助。

+0

谢谢例如,我会检查这一个,但我希望有一些解决方案,而不使用mongo集合;)。在我的情况下,每个用户的dynamicData都会有所不同,所以可能需要为每个用户ID i数据库添加dynamicData。顺便说一下,我发现另一个解决方案,可能是Meteor.Stream https://meteorhacks.com/introducing-meteor-streams –

+0

我明白了。感谢您的支持 - 我认为Meteor.Stream对您的用例会更好,因为它似乎在客户端之间传输数据,而不是在服务器之间保存数据。 无论如何,以上是针对一个电子菜单,它解释了需要一个数据库来保存信息。如果您的用例更加短暂(例如聊天应用程序),我可以看到Stream正在为您工作。 – Corrax