2016-04-10 7 views
0

In meiner HTML-Datei arbeiten, ich habe eine #each Schleife wie folgt aus:Meteor {{}} #each Schleife nicht

{{#each messages}} 
    {{> chat_message}} 
{{/each}} 

In meiner Helfer Klasse habe ich eine Methode nenne Chat-Nachrichten von den Chats abrufen Sammlung:

Template.chat_page.helpers({ 
    messages:function(){ 
     if(!Meteor.user()){ 
        alert("Please log in to chat with someone"); 
        return; 
     } 
     else{ 
      var chatId = Meteor.call("startChat",Session.get("otherUserId"),function(err,res){ 
      if(err){ 
       console.log("callback failed"); 
       return; 
      } 

       Session.set("chatId", res._id); 
       var arrayLength = res.length; 
       for (var i = 0; i < arrayLength; i++) { 
        console.log("Message "+ i +"is " + res.message[i].text); 

       } 
       return res.messages; 
      }); 
      } 
    } 
}); 

ich kann nicht scheinen, um herauszufinden, warum die #each Schleife keine der Nachricht zeigt Texte aus dem Helfer zurückgegeben? Der Text im Nachrichtenarray wird auch nicht in die Konsole gedruckt. Die Sitzungsvariable "chatId" wird gesetzt. Also scheint meine Methode zu funktionieren und das gesamte Objekt in "res" zurückzugeben. Irgendwelche Zeiger?

+0

Ist die Methode Server oder Client-Seite? Können Sie den Methodencode einfügen? –

Antwort

0

Wenn Ihre Methode auf der Serverseite ausgeführt wird, kann die Session-Variable (nur Client) nicht festgelegt werden. Wenn die Methode auf dem Client ausgeführt wird, scheint es, als ob sie keine Ergebnisse für Ihre Abfrage gefunden hat (haben Sie die abgefragte Sammlung abonniert?). Wenn die Methode auf dem Server ausgeführt wird, wird chatId sofort undefiniert auf dem Client zurückgeben.

+0

Die Methode wird auf der Serverseite ausgeführt. Also funktioniert die Callback-Funktion und ich bekomme eine Chat-ID zurück. – achatter

0

Ihre Meteor Methode ruft Server Rückruf asynchroner Bedeutung Funktion später ausgeführt wird, so dass Sie ein Session-Variable verwenden, um die UI wie diese

Template.chat_page.onCreated(function() { 
    var template = this; 
    template.autorun(function() { 
     Session.setDefault("messages-" + Session.get("otherUserId"), []); 
     if(!Meteor.user()){ 
      alert("Please log in to chat with someone"); 
      return; 
     } else { 
      var chatId = Meteor.call("startChat", Session.get("otherUserId"),function(err,res){ 
      if(err){ 
       console.log("callback failed"); 
       return; 
      } 

       Session.set("chatId", res._id); 
       var arrayLength = res.length; 
       for (var i = 0; i < arrayLength; i++) { 
        console.log("Message "+ i +"is " + res.message[i].text); 

       } 
       Session.set("messages-" + Session.get("otherUserId"), res.messages); 
      }); 
      } 
    }); 
}); 

Template.chat_page.helpers({ 
    messages: function() { 
     var otherUserId = Session.get("otherUserId"); 
     return otherUserId ? Session.get("messages-" + otherUserId) : []; 
    } 
}); 
+0

Danke! Mit dieser Route bekomme ich einen Fehler - 'Uncaught Error: {{#each}} akzeptiert zur Zeit nur Arrays, Cursor oder falsche Werte.' Was interessant ist, weil res.messages ein Array sein sollte ... – achatter

+0

@achatter Leider habe ich einen Fehler in der letzten Zeile. Ich habe 'Session.set' anstelle von' Session.get' verwendet. Ich korrigiere es jetzt. – Kishor

0

Sie kehren nicht direkt Methode Antwort zu aktualisieren, in html Helfer, weil Meteor Methoden seine Methoden asynchron aufrufen.

  1. Sie können die Antwort in einer reaktiven Variablen oder Sitzung speichern. Ich bevorzuge reactive var, wenn Sie nicht global antworten möchten.

  2. Sie können auch einfach: reactive-Methode-Paket, dass Sie die meisten Jobs tun werden. Für weitere Informationen besuchen here