Ich habe zwei meiner Publikationen zu einer einzigen zusammengefasst, da sie sich sehr ähnelten. Beide haben eine Reihe von Cursor zurückgegeben. Ich habe sie in Low-Level-API umgeschrieben, um etwas Kontrolle über das Entfernen von Daten zu machen.Meteor-Publikation this.ready löst nicht aus
Mein Problem ist, dass, aus einem Grund, den ich völlig ignoriere, das Abonnement onReady
Rückruf nie ausgelöst wird. Ich habe andere Low-Level-Pubsub in meiner App, die Daten auf ähnliche Weise veröffentlichen und das funktioniert perfekt.
Auf dem Server werden alle meine Protokolle ordnungsgemäß angezeigt, und es wird kein Fehler angezeigt. Die Publikation wird korrekt ausgeführt und die Daten werden effektiv an den Client gesendet. Auf dem Client wird keiner der Callbacks onReady
oder onError
ausgelöst.
Veröffentlichung:
Meteor.publish("getTalkthread", function (thread_id) {
unblock(this);
console.log("start");
let uids = tags = corrections = [],
self = this;
let posts_cursor = Modules.both.queryGet({
type : 'posts',
method : 'find',
query : { $or: [
{ _id: thread_id },
{ parent: thread_id }
]
},
projection : { sort : { _id: 1 },
limit : 50
}
});
let posts_array = posts_cursor.fetch(),
posts_ids = posts_array.map(e => (e._id));
//console.log("fetched posts", posts_array);
let corrs_cursor = Modules.both.queryGet({
type : 'corrections',
method : 'find',
query : { talkId: { $in: posts_ids } },
projection : { sort : { _id: 1 },
limit : 50
}
});
let corrs_array = corrs_cursor.fetch();
//console.log("fetched corrs", corrs_array);
let posts_authors = posts_array.map(e => (e.owner)),
corrs_authors = corrs_array.map(e => (e.owner));
let users_ids = _.union(posts_authors, corrs_authors);
let users_cursor = Modules.both.queryGet({
type : 'users',
method : 'find',
query : { _id: { $in: users_ids } },
projection : { sort : { date: -1 },
limit : 100,
fields : USER_PROFILE_FIELDS_
}
});
//console.log("fetched users", users_cursor.fetch());
let observers = {};
observers.posts = posts_cursor.observeChanges({
added : (id, fields) => { console.log("post added " + id); self.added ("posts", id, fields); },
changed : (id, fields) => { console.log("post changed " + id); self.changed("posts", id, fields); },
removed : (id) => {
console.log("test");
if (id != thread_id) {
console.log(true);
self.removed("posts removed " + id);
}
}
});
observers.users = users_cursor.observeChanges({
added : (id, fields) => { console.log("user added " + id); self.added ("users", id, fields); },
changed : (id, fields) => { console.log("user changed " + id); },
removed : (id) => { console.log("user removed " + id); }
});
observers.corrs = corrs_cursor.observeChanges({
added : (id, fields) => { console.log("corr added " + id); self.added ("corrections", id, fields); },
changed : (id, fields) => { console.log("corr changed " + id); self.changed("corrections", id, fields); },
removed : (id) => { console.log("corr removed " + id); self.removed("corrections", id); }
});
console.log("observers created");
this.ready();
self.onStop(() => {
observers.posts.stop();
observers.users.stop();
observers.corrs.stop();
});
console.log("end");
});
Abonnement:
console.log("sub");
self.subscribe("getTalkthread", id, self.rerun.get()), {
onReady: function() {
console.log("READY");
if (!Posts.findOne({ _id: id })) {
$("#404NotFound").show();
$("#isoContent").hide();
} else if (Posts.findOne(id)) {
$("#isoContent").show();
}
$("#spin").hide();
},
onError: function() {
console.log("ERROR");
$("#spin").hide();
$("#404NotFound").show();
$("#isoContent").hide();
}
};
Die Client-Seite korrekt gerendert wird, aber die DOM-Manipulation wird nicht ausgelöst, um die Anzeige des Inhalts zu verbieten. Kann jemand sehen, was ich hier falsch mache?
Dank Sie
EDIT:
Ich habe versucht, ein Array der drei Cursor zurückzukehren, und aus welchen Gründen auch immer, das Problem ist das gleiche. Ich sehe jedoch nicht warum.
nicht sicher, was 'deblock (this);' ist. Es gibt Pakete, die es Ihnen erlauben, 'this.unblock()' in Publikationen zu tun, wenn Sie das so verstanden haben, –
nicht sicher, was das Problem ist. Ich würde mit einer leeren Publikation testen, die gerade 'this.ready' aufgerufen hat und sehen, ob Ihr Callback auf dem Client aufgerufen wird. dann langsam die Veröffentlichung aufbauen. –
Und die Benennung der Variablen mit Unterstrichen schmerzt meine Augen. Verwenden Sie camelCase in JS. Dies ist nicht Python –