I dette tilfælde handler det mest om en misforståelse af Meteors datamodel.
Selvom det er muligt at sende data ved hjælp af et metodekald, vil du normalt bruge publikationer og abonnementer
at sende data til klienten. Disse har den næsten magiske egenskab, at forespørgsler er live - det vil sige, at eventuelle opdateringer til forespørgslen vil blive sendt til klienten automatisk. Den aktuelle kode du har, hvis den fungerede korrekt, ville ikke have live data. Det specifikke problem er, at Meteor.call
er asynkron, så din beskedhjælper vil ikke se noget.
I stedet er her, hvad du vil gøre. På serveren vil du opsætte en publikation af meddelelsessamlingen:
Meteor.publish("someWeirdName", function() {
return Messages.find({},{ sort: { timestamp:-1}, limit: 20});
});
Bemærk forskellene fra din kode:der er ingen fetch()
, fordi vi vil have en levende markør, og 20
er sandsynligvis, hvad du har tænkt dig som en grænsemulighed. Bemærk, at jeg også kaldte dette someWeirdName
fordi det er navnet på udgivelsen , og ikke samlingen, som du vil bruge til at abonnere på klienten. For en mere detaljeret forklaring kan du se dette indlæg
.
Så på klienten skal du blot bruge følgende:
Meteor.subscribe("someWeirdName");
Template.messages.helpers({
showMessages: function(){
return Messages.find();
}
});
Bemærk, at dit tidligere opkald til Meteor.subscribe("Messages")
gjorde ingenting, fordi der ikke var nogen publikation med navnet Messages
. Vi vil også bruge meddelelsernes cache på klientsiden til at oprette en markør til at vise meddelelserne.
Desuden kræver al denne kode, at du har følgende erklæret på både serveren og klienten:
Messages = new Mongo.Collection("callMeWhateverYouWant");
Bemærk også, at argumentet, der bruges til at instansiere denne samling, ikke har noget at gøre med, hvordan du henviser til samlingen i din kode, medmindre du skriver en tilpasset udgivelse . Det identificerer blot samlingen i den underliggende database.