In questo caso, si tratta principalmente di un'incomprensione del modello di dati di Meteor.
Sebbene sia possibile inviare dati utilizzando una chiamata al metodo, di solito ti consigliamo di utilizzare pubblicazioni e abbonamenti
per inviare dati al cliente. Questi hanno la proprietà quasi magica che le query sono attive - ovvero, eventuali aggiornamenti alla query verranno inviati automaticamente al client. Il codice corrente che hai, se funzionasse correttamente, non avrebbe dati in tempo reale. Il problema specifico è che Meteor.call
è asincrono, quindi l'assistente messaggi non vedrà nulla.
Invece, ecco cosa vuoi fare. Sul server, imposterai una pubblicazione della raccolta dei messaggi:
Meteor.publish("someWeirdName", function() {
return Messages.find({},{ sort: { timestamp:-1}, limit: 20});
});
Nota le differenze rispetto al tuo codice:non c'è fetch()
, perché vogliamo un cursore live e il 20
è probabilmente ciò che intendevi come opzione limite. Nota che ho chiamato anche questo someWeirdName
perché questo è il nome della pubblicazione , e non la raccolta, che utilizzerai per iscriverti al client. Per una spiegazione più dettagliata, potresti voler vedere questo post
.
Quindi, sul client, hai semplicemente bisogno di quanto segue:
Meteor.subscribe("someWeirdName");
Template.messages.helpers({
showMessages: function(){
return Messages.find();
}
});
Tieni presente che la tua precedente chiamata a Meteor.subscribe("Messages")
non stava facendo nulla, perché non c'era alcuna pubblicazione denominata Messages
. Inoltre, utilizzeremo la cache dei messaggi lato client per creare un cursore per visualizzare i messaggi.
Inoltre, tutto questo codice richiede che tu abbia dichiarato quanto segue sia sul server che sul client:
Messages = new Mongo.Collection("callMeWhateverYouWant");
Si noti inoltre che l'argomento utilizzato per creare un'istanza di questa raccolta non ha nulla a che fare con il modo in cui si fa riferimento alla raccolta nel codice, a meno che non si stia scrivendo un pubblicazione personalizzata . Identifica semplicemente la raccolta nel database sottostante.