客户端上的集合不会更改Meteor.subscribe与React

时间:2016-12-15 15:23:57

标签: javascript reactjs meteor

我正在使用Meteor与React JS。 我收到了" list"通过此代码,

Meteor.subscribe('getList', {status:'active'},function(){
    self.setState({lists:Lists.find().fetch()});
});

以下是发布代码,

Meteor.publish('getList', function(data){
    data.user = this.userId;
    return Lists.find(data);
});

所以它正在发挥作用。问题是我有两个组件调用Meteor.subscribe(' getList')。但状态不一样。

所以在其他组件中,我有这个代码,

Meteor.subscribe('getList', {status:'archived'},function(){
    self.setState({lists:Lists.find().fetch()});
});

所以这里发生的是,如果用户转到FirstComponent,this.state.lists为空(这是正确的)。然后,当用户导航到SecondComponent时,this.state.lists将填充数据(这是正确的)。但是当用户返回到FirstComponent时,this.state.lists仍然填充了数据(这是错误的)。

就像客户端中的第一个集合(空)仍然存在。然后添加第二个集合(非空)。我想在再次订阅之前清除客户端中的集合。

顺便说一句,我使用的是flow-router。

2 个答案:

答案 0 :(得分:1)

看起来您正在Meteor.subscribe onReady回调中设置React状态。每个组件是否都拥有自己的状态?

你在哪里打电话给Meteor.subscribe?请记住,Meteor将订阅数据放在本地mini-mongo中,当您调用Lists.find()时,您正在那里阅读。

您设置此方法的方式,数据不会被动。您需要将句柄存储到Meteor.subscribe游标并使用它来管理订阅生命周期。

如果您可以分享更多代码,我可以给出更简洁的答案。

答案 1 :(得分:1)

由于订阅是累积的,因此您应该在setState函数中重复查询条件:

let query = {status:'active'};
Meteor.subscribe('getList',query,function(){
    self.setState({lists:Lists.find(query).fetch()});
});

query = {status:'archived'};
Meteor.subscribe('getList',query,function(){
    self.setState({lists:Lists.find(query).fetch()});
});

但请注意,从安全角度来看,您确实不希望将(不受信任的)客户端中的查询对象作为参数传递给订阅!从控制台有人可以做:

Meteor.subscribe('getList',{});
相关问题