Meteor订阅的奇怪行为(错误大小的客户端集合)

时间:2015-07-21 17:05:14

标签: mongodb meteor iron-router

我有一个流星宠物项目,为了学习目的,我实施了传统的分页。这意味着,我只显示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机制有一个明显的问题,但是无法弄清楚那些没有按预期工作的东西。

1 个答案:

答案 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