Meteor:发布动态请求的项目范围

Meteor: publish dynamically requested range of items

我有 5000 多条记录,数量庞大 collection。我希望能够一次查看 10 条记录。如何以这种方式动态发布数据?

到目前为止我已经试过了:

我的 server.js 文件:

Meteor.methods({
    publishSongs : function (first, last) {
        Meteor.publish('adminSongs', function() {
            return Songs.find({}, {
                skip : first,
                limit : last,
                sort : {
                    date : -1
                }
            });
        });
    }
});

我的client.js文件:

Template.admin.events({
    'click #previous' : function() {
        updateSession(-10);
        publishSong();
    },
    'click #next' : function() {
        updateSession(10);
        publishSong();
    }
});

Template.admin.onCreated(function() {
    Session.setDefault('limit', {
        first : 0,
        last : 10
    });
    publishSong()
})

function publishSong() {
    Meteor.call(
        'publishSong',
        Session.get('limit').first,
        Session.get('limit').last
    );
}

function updateSession(value) {
    Session.set('limit', {
        first: Session.get('limit').first + value,
        last: Session.get('limit').last + value,
    });
}

服务器正在打印此错误消息:

Ignoring duplicate publish named 'adminSongs'

看来我使用的出版物有误,需要一些指导。

您似乎从未更新过 Session.get('limit')。您需要更新然后按 next/previous 否则您将始终获得相同的记录。您还需要改变您发表文章的方式:

Template.admin.events({
    'click #previous' : function() {
        updateSession(-10);
    },
    'click #next' : function() {
        updateSession(10);
    }
});

Template.admin.onCreated(function() {
    Session.setDefault('limit', {
        first : 0,
        last : 10
    });
    Template.instance().autorun( function() {
        Template.instance().subscribe('adminSongs', Session.get('limit').first, Session.get('limit').last);
    });
});

function updateSession(value) {
    Session.set('limit', {
        first: Session.get('limit').first + value,
        last: Session.get('limit').last + value,
    });
}

根据您的代码,我假设您已经为 return 可用歌曲定义了一个助手。上面的代码使您拥有一个订阅,并且该订阅将在您的会话变量更改时随时更新。

您的服务器代码也需要更新:

Meteor.publish('adminSongs', function(first, last) {
    return Songs.find({}, {
        skip : first,
        limit : last,
        sort : {
            date : -1
        }
    });
});

可以在Meteor.method之外。