2017-02-15 1 views
0

Hier ist mein Szenario:Doppelte IDs in Lokale Sammlung wenn Meteor Abonnement ändert

ich eine Sammlung von Kalenderereignissen haben. Für einige Ereignisse ist eine Wiederholungsregel festgelegt. Wenn ich Ereignisse im Client abonniere, erstelle ich eine neue lokale Sammlung namens LocalEvents. Ich durchlaufe alle meine Ereignisse, die aus der Events-Auflistung veröffentlicht werden, und füge ein neues Dokument für jedes Vorkommen meines Ereignisses in meine lokale Sammlung ein.

Hier ist mein Code mit Kommentaren

//create reactive variable 
const searchQuery = new ReactiveVar(null); 

export default createContainer(({ params }) => { 
    //subscribe to subscription passing the reactive var as the variable 
    const subscription = Meteor.subscribe('Events.publications.admin.list.all', searchQuery.get()); 
    const loading = !subscription.ready(); 
    const allEvents = Events.find(); 

    //loop through cursor, if event recurs - create new document for the event and insert it in to LocalEvents collection 
    allEvents.forEach(function(event) { 
     if (event.eventRecurs) { 
      //grab array of all recurring dates 
      const dates = event.recurringDates; 
      //loop through recurring dates and create new event document for each with a random ID and a parentId of the original event 
      _.each(dates, (date) => { 
       LocalEvents.insert({ 
        '_id': Random.id(), 
        'name': event.name, 
        'description': event.description, 
        'defaultDate': date, 
        'parentId': event._id 
       }); 
      }) 

     } else { 
      //if event doesn't recur, set parentId and insert into local collection 
      event.parentId = event._id; 
      LocalEvents.insert(event); 
     } 
    }); 

    const events = LocalEvents.find({}, { sort: { defaultDate: 1 }}).fetch(); 
    //pass everything to the component 
    return { loading, events, searchQuery }; 
}, AdminEventsAll); 

Mein Problem ist, dass, wenn mein Abonnement Änderungen (durch eine Suchleiste verwenden) - es scheint, dass die lokale Sammlung noch einige Dokumente in es hält als es Fälle wiederholt werden der Ereignisse. Das Argument, das ich an mein Abonnement (searchQuery) übergebe, wird jedes Mal gesetzt, wenn eine Taste in einer Suchleiste in meiner Benutzeroberfläche gedrückt wird - dies erzeugt eine reaktive Suche. Während ich tippe, sehe ich für jeden Buchstaben, den ich tippe, die Dokumente doppelt. Es zeigt im Grunde, dass die lokale Sammlung mit den gleichen Dokumenten nachfüllt, so dass sie sich immer wieder wiederholen.

Wie kann ich sicherstellen, dass die Sammlung ordnungsgemäß in meinem Container geleert wird, wenn sich die searchQuery ändert?

Vielen Dank im Voraus

** EDIT - Lösung gefunden **

ich die Lösung, die ich als Antwort

Antwort

0

Für alle anderen gefunden hinzugefügt, die ein ähnliches Problem hat, gelang es mir, eine finden Lösung.

Ich habe

Tracker.autorun(function(allEvents) { 
    LocalEvents.remove({}); 
}); 

nun jederzeit den Cursor von den Zeichnungsänderungen (zum Beispiel, wenn ein Nutzer nach und ändert die searchQuery reaktiven var), die Tracker-Funktion wird die lokale Sammlung löschen und dann wird es neu bevölkert.

Verwandte Themen