2016-06-08 119 views
0

我已经订阅了流星的集合,并传递页码以允许分页。 limit参数设置为15,因此不应该返回超过15个文档,但是当我切换页码时,订阅会连续返回3个连续15次,30次和15次文档。只有最后一个是正确的15.流星订阅发送大量数据

因此,当表格数据增长到30行然后再次回到15时,UI会看到“闪存”。

我使用的UI反应并含有组分像这样将数据传递作为道具到呈现组件:

export default createContainer(props => { 

    // Get collection name from router/url and grab mongo collection 
    let collectionName = props.routeParams.collectionId; 
    let Collection = CollectionData(collectionName).collection; 

    // Get paged results based on URL query page 
    Meteor.subscribe(collectionName, props.location.query.page || 1); 

    return { 
     items: Collection.find({}, {sort: {createdAt: -1}}).fetch(), 
     total: Collection.find({}).count() 
    }; 

}, Collection); 

在呈现组件我更新路由器历史状态,改变页面数像?page = 1。这会导致重新呈现,它将更新“props.location.query.page”的值,以允许订阅数据发生更改。我不确定是否有更好的方法来改变分页值。

的发布代码如下所示:

// Publish data 
if(Meteor.isServer) { 
    Meteor.publish(mongoCollectionName, function(page){ 
     if(page) { 
      let pageSize = 15; 
      page = parseInt(page)-1; 
      if(page < 0) page = 0; 
      return collection.find({}, {limit: pageSize, skip: page*pageSize}); 
     } else { 
      return collection.find({}); 
     } 
    }); 
} 

从我可以看到它似乎我的组件接收数据之前流星加盟15两个数组,以使30个文档的阵列,在某些时候。

回答

0

您可以使用模板级订阅而不是全局订阅来防止对同一数据进行多个订阅,这可以解决您的问题。

里面你onCreated函数模板调用this.subscribe("nameOfSub", params)其中nameOfCollection是您订阅的名称,而params是你。

使用通过{{Template.subscriptionsReady}}助手时,模板订阅准备检测任何PARAMS。

+0

我认为这只适用于大火?这怎么能用反应来实现呢? – wazzaday