2016-05-06 18 views
0

Ich versuche, eine Anwendung mit mehreren Chatrooms zu erstellen. Momentan funktioniert einer der Räume, indem er Nachrichten sendet und empfängt. Wenn ich jedoch eine Vorlage route und ändere und versuche, eine Nachricht in einem anderen Raum zu senden, wird die Nachricht nicht gesendet, aber der Link oben ändert sich? d. h. localhost: 3000/java? text = hi - Es wird angezeigt, dass die Nachricht zwischengespeichert wird.Meteor Chat - mehrere Räume

Wie kann ich Nachrichten erhalten, um die anderen Räume zu senden, in der Sammlung zu speichern und anzuzeigen? Hier ist mein Code: Client.js

// This code only runs on the client 
    Meteor.subscribe("messages", { 
    onReady: function() { 
     scrollToBottom(); 
     autoScrollingIsActive = true; 
    } 
    }); 


    /* helper code */ 
    Template.body.helpers({ 
    recentMessages: function() { 
     return Messages.find({}, {sort: {createdAt: 1}}); 
    }, 
    /* unread message helper */ 
     thereAreUnreadMessages: function() { 
     return thereAreUnreadMessages.get(); 
    } 
    }); 

    /*chat window scrolling*/ 
    Template.message.onRendered(function() { 
    if (autoScrollingIsActive) { 
     scrollToBottom(250); 
    } else { 
     if (Meteor.user() && this.data.username !== Meteor.user().username) { 
     thereAreUnreadMessages.set(true); 
     } 
    } 
    }); 
Template.body.events({ 
"submit .new-message": function (event) { 
    var text = event.target.text.value; 

    Meteor.call("sendMessage", text); 
    scrollToBottom(250); 

    event.target.text.value = ""; 
    event.preventDefault(); 
}, 


/* scroll event */ 
    "scroll .message-window": function() { 
    var howClose = 80; // # pixels leeway to be considered "at Bottom" 
    var messageWindow = $(".message-window"); 
    var scrollHeight = messageWindow.prop("scrollHeight"); 
    var scrollBottom = messageWindow.prop("scrollTop") + messageWindow.height(); 
    var atBottom = scrollBottom > (scrollHeight - howClose); 
    autoScrollingIsActive = atBottom ? true : false; 
    if (atBottom) {  // <--new 
    thereAreUnreadMessages.set(false); 
    } 
}, 

"click .more-messages": function() { 
    scrollToBottom(500); 
    thereAreUnreadMessages.set(false); 
} 
}); 

Template.footer.usercount = function() { 
    return Meteor.users.find().count(); 
}; 

Hier mein server.js

// This code only runs on the server 
    Meteor.publish("messages", function() { 
    return Messages.find(); 
    }); 

    // This code only runs on the server 
    Meteor.publish("messages_java", function() { 
    return MessagesJava.find(); 
    }); 

ist Und hier ist der Template-Code für die "Java-Raum":

<template name="java"> 
<!--<h6>This is the Java template</h6>--> 
<!--<p>*Put chatroom here*</p>--> 
<div class="container"> 
    <header> 
     <h1>ITHub Java Room</h1> 
     {{> loginButtons}} 
    </header> 

<!-- chat messages here --> 
<!-- --> 
    <ul class="message-window"> 
     {{#each recentMessagesJava}} 
     {{> message}} 
     {{/each}} 
    </ul> 
    <!-- more-messages button --> 
    {{#momentum plugin="fade"}} 
     {{#if thereAreUnreadMessages}} 
     <button class="more-messages">New Messages &#x25BE;</button> 
     {{/if}} 
    {{/momentum}} 

    <footer> 
     {{#if currentUser}} 
     <form class="new-message"> 
      <input type="text" name="text" placeholder="Add a message" autocomplete="off" /> 
     </form> 
     {{/if}} 
     <br /> 
    </footer> 

    <hr /> 
<li class="message-java"> 
    <div class="username">{{username}}</div> 
    <div class="message-text">{{messageText}}</div> 
</li> 

    </div> 

Antwort

0

Ihre Vorlage wird nicht body, aber java genannt, um Ereignisse anzuhängen, müssen Sie sie über Template.java.helpers hinzufügen, wie folgt:

Template.java.events({ 
"submit .new-message": function (event) { 
    var text = event.target.text.value; 

    Meteor.call("sendMessage", text); 
    scrollToBottom(250); 

    event.target.text.value = ""; 
    event.preventDefault(); 
}, 


/* scroll event */ 
    "scroll .message-window": function() { 
    var howClose = 80; // # pixels leeway to be considered "at Bottom" 
    var messageWindow = $(".message-window"); 
    var scrollHeight = messageWindow.prop("scrollHeight"); 
    var scrollBottom = messageWindow.prop("scrollTop") + messageWindow.height(); 
    var atBottom = scrollBottom > (scrollHeight - howClose); 
    autoScrollingIsActive = atBottom ? true : false; 
    if (atBottom) {  // <--new 
    thereAreUnreadMessages.set(false); 
    } 
}, 

"click .more-messages": function() { 
    scrollToBottom(500); 
    thereAreUnreadMessages.set(false); 
} 
}); 

Und das gleiche ist mit helpers.

+0

Fortschritt gemacht, der zweite Raum sendet und empfängt dieselben Nachrichten wie der erste Raum, folgt Ihrem Rat und gibt etwas zurück, bedeutet das, dass ich eine neue Sammlung von Nachrichten für jeden Raum erstellen muss? – Kaneo71

+0

Nein, Sie können eine Sammlung haben, aber Sie müssen sie irgendwie sortieren, zum Beispiel nach Benutzername? Wenn Sie mit 'xyz' chatten, sollten Sie nur Elemente zurückgeben, die irgendwie mit dieser Person verbunden sind. Sie sollten wahrscheinlich in die Sammlung einfügen: Nachricht, Datum und Benutzername und dann sortieren Sie die Elemente 'username === Leute, mit denen Sie chatten. – Sindis

Verwandte Themen