I det här fallet handlar det mest om ett missförstånd av Meteors datamodell.
Även om det är möjligt att skicka data med ett metodanrop, brukar du vilja använda publikationer och prenumerationer
att skicka data till klienten. Dessa har den nästan magiska egenskapen att frågor är live - det vill säga alla uppdateringar av frågan kommer att skickas till klienten automatiskt. Den nuvarande koden du har, om den fungerade korrekt, skulle inte ha livedata. Det specifika problemet är att Meteor.call
är asynkront, så din meddelandehjälp kommer inte att se någonting.
Istället, här är vad du vill göra. På servern kommer du att ställa in en publikation av meddelandesamlingen:
Meteor.publish("someWeirdName", function() {
return Messages.find({},{ sort: { timestamp:-1}, limit: 20});
});
Observera skillnaderna från din kod:det finns ingen fetch()
, eftersom vi vill ha en levande markör och 20
är förmodligen vad du tänkt som ett gränsalternativ. Observera att jag också kallade detta someWeirdName
eftersom det är namnet på publikationen , och inte samlingen, som du kommer att använda för att prenumerera på klienten. För en mer detaljerad förklaring kanske du vill se det här inlägget
.
Sedan, på klienten, behöver du helt enkelt följande:
Meteor.subscribe("someWeirdName");
Template.messages.helpers({
showMessages: function(){
return Messages.find();
}
});
Observera att ditt tidigare anrop av Meteor.subscribe("Messages")
gjorde ingenting, eftersom det inte fanns någon publikation med namnet Messages
. Vi kommer också att använda meddelandecachen på klientsidan för att skapa en markör för att visa meddelandena.
Dessutom kräver all denna kod att du har följande deklarerade på både servern och klienten:
Messages = new Mongo.Collection("callMeWhateverYouWant");
Observera också att argumentet som används för att instansiera den här samlingen inte har något att göra med hur du refererar till samlingen i din kod, om du inte skriver en anpassad publikation . Det identifierar helt enkelt samlingen i den underliggande databasen.