Meteor订阅发送大量数据

时间:2016-06-08 11:52:19

标签: javascript meteor reactjs

我订阅了Meteor的集合,并传递了一个页码以允许分页。 limit参数设置为15,因此不应返回不超过15个文档,但是当我切换页码时,订阅将连续3次返回15,30,然后再返回15个文档。只有最后一个是正确的15。

因此,UI会看到" flash"随着表数据增长到30行,然后再回到15行。

我正在使用针对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({});
        }
    });
}

从我所看到的情况来看,似乎meteor正在加入两个15的数组来制作30个文档的数组,在我的组件接收数据之前的某个时刻。

1 个答案:

答案 0 :(得分:0)

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

在模板调用this.subscribe("nameOfSub", params)的onCreated函数中,其中nameOfCollection是您订阅的名称,params是您传入的任何参数。

使用{{Template.subscriptionsReady}}帮助程序检测模板订阅何时准备就绪。