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 ▾</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>
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
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