В този случай става въпрос най-вече за неразбиране на модела на данните на Meteor.
Въпреки че е възможно да се изпращат данни чрез извикване на метод, обикновено ще искате да използвате публикации и абонаменти
за изпращане на данни на клиента. Те имат почти магическото свойство, че заявките са активни - т.е. всички актуализации на заявката ще бъдат изпратени на клиента автоматично. Текущият код, който имате, ако работеше правилно, нямаше да има живи данни. Конкретният проблем е, че Meteor.call
е асинхронен, така че вашият помощник за съобщения няма да вижда нищо.
Вместо това, ето какво искате да направите. На сървъра ще настроите публикация от колекцията съобщения:
Meteor.publish("someWeirdName", function() {
return Messages.find({},{ sort: { timestamp:-1}, limit: 20});
});
Обърнете внимание на разликите от вашия код:няма fetch()
, защото искаме жив курсор и 20
вероятно е това, което сте възнамерявали като ограничение. Имайте предвид, че също нарекох това someWeirdName
тъй като това е името напубликацията , а не колекцията, която ще използвате за абониране на клиента. За по-подробно обяснение може да искате да видите тази публикация
.
След това на клиента просто се нуждаете от следното:
Meteor.subscribe("someWeirdName");
Template.messages.helpers({
showMessages: function(){
return Messages.find();
}
});
Имайте предвид, че предишното ви обаждане на Meteor.subscribe("Messages")
не правеше нищо, защото нямаше публикация с име Messages
. Освен това ще използваме кеша на съобщенията от страна на клиента, за да създадем курсор за показване на съобщенията.
Освен това целият този код изисква да имате декларирано следното както на сървъра, така и на клиента:
Messages = new Mongo.Collection("callMeWhateverYouWant");
Имайте предвид също, че аргументът, използван за инстанциране на тази колекция, няма нищо общо с начина, по който се отнасяте към колекцията във вашия код, освен ако не пишете персонализирана публикация . Той просто идентифицира колекцията в основната база данни.