2015-10-26 105 views
0

我只想檢查,因爲我沒有看到它在文檔中。也許我只是想念它。瞭解跳過服務器與客戶端流星

據我可以告訴我是否訂閱跳過然後我不跳過客戶端。正確?

我正在使用鐵路由器。我有這樣

Router.route('/docs/:_page', { 
    template: 'doclist', 
    subscriptions: function() { 
    var page = parseInt(this.params._page) - 1; 
    var skip = page * 10; 
    var limit = 10; 
    return Meteor.subscribe("pages", skip, limit); 
    }, 
}); 

的相應發佈的代碼是這樣

Meteor.publish("pages", function (skip, limit) { 
    return Docs.find({}, {skip: skip, limit: limit}); 
}); 

但現在在模板助手因爲只有limit導致MiniMongo

Template.doclist.helpers({ 
    docs: function() { 
     var route = Router.current(); 
     var pageId = parseInt(route.params._page) || 1; 
     var page = pageId - 1; 
     var skip = page * 10; 
     return Docs.find({}, { 
     // skip: skip 
     limit: limit, 
     }); 
    }, 
    }); 
我不使用跳躍AFAICT

它似乎工作。如果我在skip行中發表評論,那麼我在第2頁上找不到任何結果。

這是正確的還是我做錯了什麼?

+1

這是正確的。該出版物將已發佈數據的副本發送給客戶端,然後將其存儲在minimongo中。在客戶端執行的查詢僅針對存儲在minimongo中的數據執行。由於您一次只發布10個文檔,minimongo只能提取10個文檔,因此客戶端不需要跳過。 –

回答

1

你是對的 - 在這種情況下,客戶不需要skip。假設您在數據庫中有100個文檔,並且您跳過前20個,限制爲10個。那麼客戶端上只會存在10個文檔。無論您何時在客戶端(在您的模板中)find,您正在查詢本地數據庫(本例中爲10個文檔),因此跳過將是不合適的。

我會告誡的是,所有這一切都是基於您擁有只有一個訂閱Docs的概念。爲了擴展上面的例子,如果另一個訂閱在客戶端的同一個集合中有另外15個文檔,那麼您可能需要執行一些額外的過濾,以便僅顯示您感興趣的過濾器。

+0

好吧,讓我好奇,什麼是最好的分頁方法?看起來我可以在服務器上執行find({},{skip:skip-limit,limit:limit * 3})',然後在客戶端上查找({},[skip:limit})'切換一個前進還是後退已經可用?或者我接近這個錯誤?我應該只發布一切,流星做對了嗎?在這種情況下,服務器只發送我在客戶端上找到的東西,還是隻是發送整個數據庫?對不起,這似乎是noob流星的問題。何時結果穩定?我目前看到他們流行起來。 – gman