我如何重置客户端订阅

时间:2014-04-22 06:06:18

标签: javascript meteor

我订阅并发布如下:

publish.js:

Meteor.publish('ProductWithSkipAndLimit', function(skip,limit){
return Product.find({}, {
        sort: {
            createdAt: 1
        },
        skip: skip,
        limit: limit
    });
});

subscribe.js:

Meteor.subscribe('ProductWithSkipAndLimit',0,10);

它将从createdAt的0排序返回到客户端10的产品。 不,我点击这样的事件:

'click' : function(e){
e.preventDefault();
Meteor.subscribe('ProductWithSkipAndLimit',10,10);
}

我想再买10件产品。好吧,我得到的产品,但10个产品没有重置。所以在客户端我有20个产品。

我如何重置客户端订阅?所以客户每次订阅只有10个产品。

3 个答案:

答案 0 :(得分:2)

Meteor.subscribe:

  

订阅记录集。返回提供stop()和ready()方法的句柄。

您需要处理Meteor.subscribe

subscription = Meteor.subscribe('ProductWithSkipAndLimit',10,10);

在事件对象中:

var subscription;

Template.NAME.events({
    'click' : function(e){
      e.preventDefault();
      subscription && subscription.stop();
      subscription = Meteor.subscribe('ProductWithSkipAndLimit',10,10);
    }
})

答案 1 :(得分:-1)

我认为,在click事件中,您必须设置会话变量Session.set('more', true);

在客户端:

Deps.autorun(function() {
   if(Session.get('more')) {
     Meteor.subscribe('ProductWithSkipAndLimit',10,10);
     Session.set('more', false);
   }
});

或者在集合中设置当前位置的一些逻辑(10,20等)

答案 2 :(得分:-1)

您询问了订阅重置问题,但看起来您无需手动执行此操作。

您可以在Tracker.autorun内订阅,并将反应值作为订阅参数传递。

然后在每个skip / limit会话变量上更改订阅将自动重置。

来自Meteor official documentation

  

如果您在反应计算中调用Meteor.subscribe,例如使用Tracker.autorun,则在计算失效或停止时,订阅将自动取消;没有必要在内部自动运行中调用停止。

以下是工作示例(METEOR@1.1.0.2):

Items = new Meteor.Collection("items");

if(Meteor.isClient) {
    Tracker.autorun(function() {
        Meteor.subscribe("items", Session.get("skip"), Session.get("limit"));
    });

    Template.main.helpers({
        items: function() {
            return Items.find({});
        }
    });

    Template.main.events({
        'click #next' : function(e){
            e.preventDefault();
            var skip = Session.get("skip");
            Session.set("skip", skip + Session.get("limit"));
        },   
        'click #prev' : function(e){
            e.preventDefault();
            var skip = Session.get("skip");
            Session.set("skip", skip - Session.get("limit"));
        }
    });

    Meteor.startup(function() {
        Session.set("skip", 0);
        Session.set("limit", 10);
    });
}

if(Meteor.isServer) {
    if (Items.find({}).fetch().length < 100) {
        _.times(100, function(n) {
            Items.insert({
                name: String(n),
                createdAt: new Date()
            });
        });
    }

    Meteor.publish("items", function(skip, limit) {        
        return Items.find({}, { limit: limit, skip: skip, sort: { createdAt: 1} });
    });
}

模板

<template name="main">
    <header>
        <h1>Items</h1>
        <nav>
            <button id="prev">prev</button>
            <button id="next">next</button>
        </nav>
    </header>
    <ul>
    {{#each items}}
        <li>{{name}}</li>
    {{/each}}
    </ul>
</template>

P.S。不要忘记删除&#34; autopublish&#34;封装