2015-05-29 67 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