Frage

Ich habe gerade festgestellt, dass wenn Sie das beobachten movedTo Ereignis einiger cursor, Das Ereignis wird nur für Dokumente ausgelöst, die ihre tatsächlich verändert haben relativ Position im resultierenden Satz, also nicht nur sein Index. Zum Beispiel, wenn der resultierende Satz von Dokumenten zuerst gleich ist [1, 2, 3], und dann ändert es sich zu [3, 1, 2], Das Ereignis wird nur für das dritte Dokument ausgelöst, nicht für alle von ihnen. Obwohl es aus Sicht der Effizienz angemessen klingt, ist die Dokumentation überhaupt nicht klar (schauen Sie hier):

bewegt (Dokument, von INDEX, bis Index, vorher)

Ein Dokument änderte seine Position im Ergebnissatz, von fromIndex zu toIndex(Das ist vor dem Dokument mit ID before). Der aktuelle Inhalt ist Dokument.

Für mich klingt "verändert seine Position im resultierenden Satz, vom Index zu Index" eher so, wie alle drei ihre Position geändert haben, also tatsächlich:

  • Einer geht aus dem Index 0 indexieren 1, ...
  • Zwei gehen aus dem Index 1 indexieren 2, und ...
  • Drei geht aus dem Index 2 zu 0.

Was ich erreichen möchte, ist, a zu beobachten cursor und wissen, ob die index von jedem Dokument ändert sich oder nicht. Während ich eine grobe Idee habe, wie ich dies implementieren kann, frage ich mich, ob es eine einfache (optimale) und "meteorfreundliche" Art gibt, dieses Problem zu lösen.

War es hilfreich?

Lösung

Dieses Verhalten macht nicht nur aus Leistung der Leistung durchaus Sinn. Denken Sie so darüber nach:

Wenn Sie verwenden observe Methode, Sie möchten über alle Änderungen informiert werden, die dem passieren Sammlung (ob auf dem Server oder in Minimongo). Jeder der Rückrufe, die Sie erhalten, ist also eine einzige Instanz der Änderung der Sammlung. Wenn Sie die Reihenfolge der Objekte ändern, indem Sie einen von ihnen an einen anderen Ort verschieben, ändern Sie die Sammlung einmal, Sie möchten also nur einen Rückruf für diese Veranstaltung erhalten.

Sie möchten 42 Mal nicht über ein einzelnes Ereignis benachrichtigt werden!

 


 

Ich denke, der einfachste Weg, diese Benachrichtigung für alle bewegten Objekte zu multiplizieren, besteht darin, sie manuell im Rückruf zu schieben. Wenn sich ein Gegenstand von Position A zu Position B bewegt, wissen Sie, dass auch alle Objekte zwischen A und B verschoben wurden. Wenn Sie also die einzelnen von ihnen anpassen müssen, tun Sie dies einfach in Schleife, die über die gesamte Liste von A nach B fließt.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top