Il modello MeteorJS non mostra dati, non appare

Originariamente pensavo che la mia collezione non stesse ricevendo dati, ma ho scoperto che avevo appena un errore di battitura nella mia query. Ma i miei dati non appaiono ancora sullo schermo. Il modello HTML è piuttosto semplice, eccolo qui:

 {{#each showMessages}} 

{{message}}

{{/each}}

Dovrebbe solo far apparire la raccolta dei messaggi quando chiamo {{> messaggi}} Ecco il lato client JS che corrisponde ad esso:

 Meteor.subscribe("Messages"); Template.messages.helpers({ showMessages: function(){ return Meteor.call("find"); } }); 

ed ecco il metodo del server:

 Meteor.methods({ insert:function(username, message){ var id = Messages.insert({ 'message': message, 'user': Meteor.userId(), 'username': username, 'timestamp': new Date() }); return "success"; }, 'find': function(){ return Messages.find({},{sort:{timestamp:-1}}, 20).fetch(); } }); 

Sono abbastanza nuovo per MeteorJS, l’ho appena ritirato ieri, quindi è probabilmente qualcosa di veramente fondamentale che mi manca, ma ho sbattuto la testa contro questo per 2 ore e ho fatto 0 progressi. Non sono sicuro o abilitato per l’autopublish. Questo non è destinato a essere un prodotto utilizzabile o altro, sto usando questo per insegnare a me stesso, quindi so che sto facendo alcune cose insicure.

In questo caso, si tratta principalmente di un fraintendimento del modello di dati di Meteor.

Sebbene sia ansible inviare dati utilizzando una chiamata al metodo, in genere è consigliabile utilizzare pubblicazioni e iscrizioni per inviare dati al client. Questi hanno la proprietà quasi magica in cui le query sono attive , vale a dire che qualsiasi aggiornamento alla query verrà inviato automaticamente al client. Il codice corrente che hai, se funzionasse correttamente, non avrebbe dati live. Il problema specifico è che Meteor.call è asincrono, quindi l’helper dei messaggi non vedrà nulla.

Invece, ecco cosa vuoi fare. Sul server, si imposterà una pubblicazione della raccolta dei messaggi:

 Meteor.publish("someWeirdName", function() { return Messages.find({},{ sort: { timestamp:-1}, limit: 20}); }); 

Nota le differenze dal tuo codice: non esiste il fetch() , perché vogliamo un cursore live e il 20 è probabilmente quello che intendevi come opzione limite. Nota che ho anche chiamato someWeirdName perché questo è il nome della pubblicazione , e non la collezione, che userai per iscriverti sul 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(); } }); 

Nota che la tua precedente chiamata a Meteor.subscribe("Messages") stava facendo nulla, perché non c’era nessuna pubblicazione chiamata Messages . Inoltre, useremo la cache lato client dei messaggi per creare un cursore per visualizzare i messaggi.

Inoltre, tutto questo codice richiede di dichiarare 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 una pubblicazione personalizzata . Identifica semplicemente la raccolta nel database sottostante.

Chiamare un metodo è asincrono, quindi restituire il risultato nell’helper non servirà a nulla. Allo stesso modo, il recupero non è reattivo.

 showMessages: function(){ return Messages.find({},{sort:{timestamp:-1}, limit: 20}); } 

Vai avanti e scopri la meteora prima di creare il tuo progetto. Sono tutto per aver difficoltà a insegnare a te stesso qualcosa di nuovo, ma una buona base solida farà miracoli ed eliminerà molta frustrazione.

Ho preparato alcuni MeteorPad per le domande iniziali. Potresti trovare alcune prime istruzioni qui

http://meteorpad.com/pad/Ba5DTe94NjFi3ZTPA/Playground_Flow-Router_Chat

Buona fortuna Tom