2015-07-23 3 views
3

Я изначально думал, что моя коллекция не получает данные, но оказалось, что у меня просто была опечатка в моем запросе. Но мои данные по-прежнему не отображаются на экране. Шаблон HTML является довольно простой, здесь:Шаблон MeteorJS, не отображающий данные, не отображается

<template name="messages" class=".messages"> 
     {{#each showMessages}} 
      <blockquote> 
       <p>{{message}}</p> 
      </blockquote> 
     {{/each}} 
</template> 

Он должен просто сделать коллекцию сообщений появляется, когда я звоню {{> сообщения}} Вот на стороне клиента JS, что соответствует ему:

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

и вот метод сервера:

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(); 
     } 
    }); 

Я довольно новыми для MeteorJS, я просто взял его вчера, так что это, вероятно, что-то действительно основное, что Я пропал без вести, но я уже два часа ударяю головой об этом и добился 0 успехов. У меня нет блокировки или автоматического включения. Это не значит, что это полезный продукт или что-то еще, я использую это, чтобы научить себя, поэтому я знаю, что делаю некоторые неуверенные вещи.

ответ

2

В этом случае речь идет главным образом о непонимании модели данных Метеор.

Хотя можно отправлять данные с помощью вызова метода, обычно вы хотите использовать publications and subscriptions для отправки данных клиенту. У них есть почти магическое свойство, которое задает live - то есть любые обновления запроса будут отправляться клиенту автоматически. Текущий код, который у вас есть, если он будет работать должным образом, не будет иметь живых данных. Конкретная проблема заключается в том, что Meteor.call является асинхронным, поэтому ваш помощник сообщений ничего не увидит.

Вместо этого, вот что вы хотите сделать. На сервере, будет создан публикации сборника сообщений:

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

Обратите внимание на отличия от кода: нет fetch(), потому что мы хотим живой курсор, и 20, вероятно, что вам предназначенный как предел. Обратите внимание, что я также назвал это someWeirdName, потому что это имя публикации , а не коллекция, которую вы будете использовать для подписки на клиент. Для более подробного объяснения вы можете увидеть this post.

Затем на клиенте, вам просто необходимо следующее:

Meteor.subscribe("someWeirdName"); 

Template.messages.helpers({ 
    showMessages: function(){ 
     return Messages.find(); 
    } 
}); 

Обратите внимание, что ваш предыдущий вызов Meteor.subscribe("Messages") не делает ничего, потому что не было ни одной публикации по имени Messages. Кроме того, мы будем использовать кеш-клиент на стороне клиента для создания курсора для отображения сообщений.

Кроме того, весь этот код требует, чтобы вы следующие объявили о сервере и клиенте:

Messages = new Mongo.Collection("callMeWhateverYouWant"); 

Заметим также, что аргумент, используемый для создания экземпляра этой коллекции не имеет ничего общего с тем, как вы смотрите к коллекции в вашем коде, если вы не пишете custom publication. Он просто идентифицирует коллекцию в базовой базе данных.

+0

Ohhhhhh это делает так много смысла, когда вы пишете это так. У меня было рудиментарное понимание того, что такое публикация, но я до сих пор не понимал, как применить его к приложению. Спасибо! – Subnatural

0

Вызов метода isync, поэтому возврат результата в помощнике не принесет пользы. Аналогично, выборка не является реактивной.

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

Перейти вперед & чтение обнаружить метеорит прежде, чем сделать свой собственный проект. Я все пытаюсь научиться чему-то новому, но хороший прочный фундамент будет творить чудеса & устранить много разочарования.

+0

Я не думаю, что это ничего не сделает, если он ничего не опубликует в «Сообщениях», как я пытался описать :) –

+0

О, да, ты прав, я думал, что он уже что-то опубликовал. –