Mis publicaciones:

Meteor.publish('items', function() {
    return Items.find({}, {skip: randomNumber, limit: 100});
});

Mi código de suscripción ocurre cuando se hace clic en un botón (en templates.event)

Meteor.subscribe('items');
Items.find().fetch();

Sin embargo, el problema es que los elementos no se actualizan con los datos nuevos, sino que se agregan datos nuevos a la lista anterior. ¿Qué puedo hacer para cancelar la suscripción de los datos antiguos?

2
good_evening 1 sep. 2014 a las 03:02

2 respuestas

La mejor respuesta

Cuando usted llama Meteor.subscribe devolverá un identificador de suscripción.

Llama al stop en el identificador para cancelarlo.

Por ejemplo, en su evento ayudante

if (SomeGlobalVar){
  SomeGlobalVar.stop();
}
SomeGlobalVar = Meteor.subscribe('items');

La otra forma es ejecutar la suscripción dentro de Deps.autorun; limpiará automáticamente las suscripciones antiguas .

Por ejemplo, en su controlador de eventos

Session.set('subscribe', true);

En otra parte de su código:

Deps.autorun(function(){ 
  if (Session.get('subscribe')){
     Meteor.subscribe('items');
  }
});

Si llama a Session.set('subsribe', false); Meteor cancelará / limpiará automáticamente esa suscripción a items.

4
nathan-m 31 ago. 2014 a las 23:06

Me parece que hay un poco de confusión aquí, cuando se conecta a una fuente de datos reactiva no se suscribe a datos específicos, por lo que cuando se agregan nuevos registros, por supuesto, se agregan a sus datos a través de esa conexión.

Si entendí su pregunta y desea que los datos nuevos reemplacen por completo los datos antiguos, le aconsejo que no cree su plantilla en torno a la Colección, sino que la compile en una versión en caché de los datos (que se guardará en un objeto y se volverá reactivo usando Deps), de esa manera tendrá control total sobre los datos que se muestran.

1
Erez Hochman 31 ago. 2014 a las 23:51