【问题标题】:Meteor subscribe sending to much dataMeteor 订阅发送大量数据
【发布时间】:2016-06-08 21:59:25
【问题描述】:

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

因此,当表格数据增长到 30 行然后又回到 15 行时,UI 会出现“闪烁”。

我正在为 UI 使用 react 并包含一个类似这样的组件,以将数据作为 props 传递给渲染组件:

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 个文档的数组。

【问题讨论】:

    标签: javascript meteor reactjs


    【解决方案1】:

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

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

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

    【讨论】:

    • 我觉得这只适用于blaze?这如何通过 react 实现?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-29
    • 2017-11-30
    • 2013-11-18
    • 2016-03-07
    相关资源
    最近更新 更多