我有一个流星宠物项目,为了学习目的,我实施了传统的分页。这意味着,我只显示Mongo集合所拥有的所有记录的子集,并且我有" next"和" prev"按钮和一个下拉菜单,用于选择每页显示的结果数量。
当我点击" next"有时我会遇到这种奇怪的故障。 " prev",好像结果列表有点长一点。这可以看到几分之一秒,然后结果显示正常。
所以我检查了我的收藏品的大小,似乎迷你mongo系列的尺寸有时比它应该大。这解释了效果,但我不知道为什么我在我的代码中产生了这种行为。
在服务器端,我通过以下方式提供我的馆藏:
/** Publish all scenarios from the current user
@cursorStart, skip parameter
@recordLimit, limit parameter
@sortPreferences, object to sort the published cursor
*/
Meteor.publish('myScenarios', function(cursorStart, recordLimit, sortPreferences){
var objSort = {};//object to sort the cursor
console.log("Record limit# "+recordLimit);
if(sortPreferences){
objSort[sortPreferences.param] = sortPreferences.order;
}else{
objSort['createdAt'] = 1;
}
Mongo.Collection._publishCursor(
Scenarios.find({owner: this.userId }, {limit :recordLimit, skip : cursorStart, sort : objSort}),
this, 'myScenarios');
this.ready();
});
这样,如果我想在每页显示10个结果,我只发布我的集合的10条记录,而不是将整个集合发送到客户端。
在相应的模板事件中,用户点击" next"或" prev"按钮我将更新会话变量,其中包含我想要显示的结果。例如
"click .next" : function(){
var routeName = Router.current().route.getName();
scenarioCount = scenarioTotalCount(routeName);//get the total size of this collection
if(Number(Session.get('scenarioCursorStart')) + Number(Session.get('scenarioResultsPerPage')) < scenarioCount)
Session.set('scenarioCursorStart', Number(Session.get('scenarioCursorStart'))+Number(Session.get('scenarioResultsPerPage')));
}
scenarioCursorStart 是 skip 参数,用于知道我是否显示前10个结果,第二个10(意思是10到19)等。当用户说他或她想要在每页显示不同数量的结果时, scenarioResultsPerPage 将根据下拉列表上的更改进行更新。这也是涉及的另一个对象,我用它来指示我想要对这些结果进行排序的字段。无论如何,只有单击&#34; next&#34;才会修改跳过参数 scenarioCursorStart 。或&#34; prev&#34;的按钮。
在客户端,我订阅了这个集合,如
MyScenarios = new Mongo.Collection('myScenarios');
...
Deps.autorun(function(){
...
Meteor.subscribe('myScenarios', Number(Session.get('scenarioCursorStart')), Number(Session.get('scenarioResultsPerPage')), Session.get('scenarioCursorOrder')); //scenarios of the current user
}
如果我 console.log 那里我的mini-mongo系列的大小( console.log(&#34;列表大小:&#34; + MyScenarios.find()。count()) )点击&#34; next&#34; (更新跳过参数 scenarioCursorStart ,但没有其他人)的大小例如是10,然后是20(或12),然后是10。如果我 console.log 在服务器大小跳过和限制参数,他们总是有正确的值,所以我没有发布一个不同大小的光标或从我想要的不同记录开始。
我的理解是,我的订阅存在问题,因为收藏的长度各不相同(并且并非总是加倍,这将更容易&#34;诊断&#34;如果我要求10每页的结果有时会得到20的长度,有时是12或13.&#34;故障&#34;不一致)但服务器端的参数似乎没问题。
我完全陷入寻找下一步或寻找的目的地。我很感激任何帮助,试图找到这个问题的原因。也许我对Meteor Pub-sub机制有一个明显的问题,但是无法弄清楚那些没有按预期工作的东西。
答案 0 :(得分:0)
您可以尝试在订阅新订阅之前停止之前的订阅。
假设代码在onRendered / onCreated函数中,您可以尝试:
var instance = this;
Deps.autorun(function() {
if( this.subscription != null ) {
this.subscription.stop();
}
this.subscription = Meteor.subscribe('myScenarios',
Number(Session.get('scenarioCursorStart')),
Number(Session.get('scenarioResultsPerPage')),
Session.get('scenarioCursorOrder')
);
}
此外,我认为Deps
在几个版本之前已更改为Tracker
,您可能希望有时开始使用Tracker
。