In dit geval gaat het meestal om een misverstand over het datamodel van Meteor.
Hoewel het mogelijk is om gegevens te verzenden met een methodeaanroep, wilt u meestal publicaties en abonnementen gebruiken
om gegevens naar de klant te sturen. Deze hebben de bijna magische eigenschap dat zoekopdrachten live zijn - dat wil zeggen dat eventuele updates van de query automatisch naar de client worden verzonden. De huidige code die je hebt, zou, als het goed zou werken, geen live gegevens hebben. Het specifieke probleem is dat Meteor.call
is asynchroon, dus je berichtenhelper ziet niets.
In plaats daarvan is dit wat u wilt doen. Op de server maak je een publicatie van de berichtenverzameling:
Meteor.publish("someWeirdName", function() {
return Messages.find({},{ sort: { timestamp:-1}, limit: 20});
});
Let op de verschillen met uw code:er is geen fetch()
, omdat we een live cursor willen, en de 20
is waarschijnlijk wat u bedoelde als een limietoptie. Merk op dat ik dit ook someWeirdName
. noemde want dat is de naam van de publicatie , en niet de verzameling, die u gaat gebruiken om u op de client te abonneren. Voor een meer gedetailleerde uitleg kun je dit bericht
bekijken .
Dan heb je op de client alleen het volgende nodig:
Meteor.subscribe("someWeirdName");
Template.messages.helpers({
showMessages: function(){
return Messages.find();
}
});
Merk op dat uw vorige oproep van Meteor.subscribe("Messages")
deed niets, omdat er geen publicatie was met de naam Messages
. We gaan ook de cache aan de clientzijde van berichten gebruiken om een cursor te maken om de berichten weer te geven.
Al deze code vereist ook dat je het volgende hebt gedeclareerd op zowel de server als de client:
Messages = new Mongo.Collection("callMeWhateverYouWant");
Merk ook op dat het argument dat wordt gebruikt om deze verzameling te instantiëren niets te maken heeft met hoe u naar de verzameling in uw code verwijst, tenzij u een aangepaste publicatie . Het identificeert eenvoudig de collectie in de onderliggende database.