Neste caso, trata-se principalmente de um mal-entendido do modelo de dados do Meteor.
Embora seja possível enviar dados usando uma chamada de método, geralmente você desejará usar publicações e assinaturas para enviar dados ao cliente. Eles têm a propriedade quase mágica de que as consultas são ao vivo - ou seja, qualquer atualização da consulta será enviada ao cliente automaticamente. O código atual que você tem, se funcionasse corretamente, não teria dados ativos. O problema específico é que
Meteor.call
é assíncrono, então seu auxiliar de mensagens não verá nada. Em vez disso, aqui está o que você quer fazer. No servidor, você configurará uma publicação da coleção de mensagens:
Meteor.publish("someWeirdName", function() {
return Messages.find({},{ sort: { timestamp:-1}, limit: 20});
});
Observe as diferenças do seu código:não há
fetch()
, porque queremos um cursor ativo e o 20
é provavelmente o que você pretendia como uma opção de limite. Observe que também chamei isso de someWeirdName
porque esse é o nome da publicação , e não a coleção, que você usará para se inscrever no cliente. Para obter uma explicação mais detalhada, consulte esta postagem
. Então, no cliente, você só precisa do seguinte:
Meteor.subscribe("someWeirdName");
Template.messages.helpers({
showMessages: function(){
return Messages.find();
}
});
Observe que sua chamada anterior de
Meteor.subscribe("Messages")
não estava fazendo nada, porque não havia nenhuma publicação chamada Messages
. Além disso, vamos usar o cache de mensagens do lado do cliente para criar um cursor para exibir as mensagens. Além disso, todo esse código exige que você tenha o seguinte declarado no servidor e no cliente:
Messages = new Mongo.Collection("callMeWhateverYouWant");
Observe também que o argumento usado para instanciar esta coleção não tem nada a ver com como você se refere à coleção em seu código, a menos que você esteja escrevendo um publicação personalizada . Ele simplesmente identifica a coleção no banco de dados subjacente.