Dalam hal ini, ini sebagian besar tentang kesalahpahaman model data Meteor.
Meskipun dimungkinkan untuk mengirim data menggunakan pemanggilan metode, biasanya Anda ingin menggunakan publikasi dan langganan
untuk mengirim data ke klien. Ini memiliki properti yang hampir ajaib yang kuerinya langsung - yaitu, setiap pembaruan pada kueri akan dikirim ke klien secara otomatis. Kode saat ini yang Anda miliki, jika berfungsi dengan baik, tidak akan memiliki data langsung. Masalah spesifiknya adalah Meteor.call
tidak sinkron, jadi penolong pesan Anda tidak akan melihat apa pun.
Sebaliknya, inilah yang ingin Anda lakukan. Di server, Anda akan menyiapkan publikasi kumpulan pesan:
Meteor.publish("someWeirdName", function() {
return Messages.find({},{ sort: { timestamp:-1}, limit: 20});
});
Perhatikan perbedaan dari kode Anda:tidak ada fetch()
, karena kita menginginkan kursor langsung, dan 20
mungkin apa yang Anda maksudkan sebagai opsi batas. Perhatikan bahwa saya juga menyebut ini someWeirdName
karena itulah nama publikasi , dan bukan koleksi, yang akan Anda gunakan untuk berlangganan di klien. Untuk penjelasan lebih detail, Anda mungkin ingin melihat postingan ini
.
Kemudian, pada klien, Anda hanya memerlukan yang berikut:
Meteor.subscribe("someWeirdName");
Template.messages.helpers({
showMessages: function(){
return Messages.find();
}
});
Perhatikan bahwa panggilan Anda sebelumnya dari Meteor.subscribe("Messages")
tidak melakukan apa-apa, karena tidak ada publikasi bernama Messages
. Selain itu, kita akan menggunakan cache pesan sisi klien untuk membuat kursor untuk menampilkan pesan.
Selain itu, semua kode ini mengharuskan Anda mendeklarasikan kode berikut di server dan klien:
Messages = new Mongo.Collection("callMeWhateverYouWant");
Perhatikan juga bahwa argumen yang digunakan untuk membuat instance koleksi ini tidak ada hubungannya dengan cara Anda merujuk ke koleksi dalam kode Anda, kecuali jika Anda menulis publikasi khusus . Ini hanya mengidentifikasi koleksi dalam database yang mendasarinya.