Meteor, One to Many Relationship & Feld nur zur clientseitigen Sammlung in Publish hinzufügen?

Kann jemand sehen, was möglicherweise an diesem Code falsch ist? Im Grunde möchte ich überprüfen, ob ein Beitrag vom aktuell angemeldeten Benutzer geteilt wurde UND der clientseitigen Sammlung ein temporäres Feld hinzufügen: isCurrentUserShared.

Dies funktioniert zum ersten Mal, wenn eine neue Seite geladen wird und vorhandene Freigaben ausgefüllt werden, oder wenn ein Datensatz NUR zum ersten Mal, wenn die Seite geladen wird, zur Shares-Sammlung hinzugefügt oder daraus entfernt wird.

1) isSharedByMe ändert nur einmal den Status, dann werden die Rückrufe immer noch gemäß console.log aufgerufen, aber isSharedByMe wird in der Posts-Sammlung nach dem ersten Hinzufügen oder Entfernen eines Datensatzes nicht aktualisiert. Es funktioniert das 1. Mal.

2) Warum werden die Rückrufe zweimal hintereinander aufgerufen, d. H. Wenn 1 Datensatz zu Sharescollection hinzugefügt wird, werden 2 Aufrufe ausgelöst, wie in console.log angezeigt.

Meteor.publish('posts', function() {

    var self = this;
    var mySharedHandle;


    function checkSharedBy(IN_postId) {
        mySharedHandle = Shares.find( { postId: IN_postId, userId: self.userId }).observeChanges({

            added: function(id) {
                console.log("   ...INSIDE checkSharedBy(); ADDED: IN_postId = " + IN_postId );
                self.added('posts', IN_postId, { isSharedByMe: true });
            },

            removed: function(id) {
                console.log("   ...INSIDE checkSharedBy(); REMOVED: IN_postId = " + IN_postId );
                self.changed('posts', IN_postId, { isSharedByMe: false });
            }
        });
    }


    var handle = Posts.find().observeChanges({

        added: function(id, fields) {
            checkSharedBy(id);
            self.added('posts', id, fields);
        },

        // This callback never gets run, even when checkSharedBy() changes field isSharedByMe.
        changed: function(id, fields) {
            self.changed('posts', id, fields);
        },

        removed: function(id) {
            self.removed('posts', id);
        }
    });

    // Stop observing cursor when client unsubscribes
    self.onStop(function() {
        handle.stop();
        mySharedHandle.stop();
    });

    self.ready();
});

Antworten auf die Frage(3)

Ihre Antwort auf die Frage