【发布时间】:2020-07-17 14:24:34
【问题描述】:
我的网络应用程序检查用户是否在 firebase 数据库中有消息。如果是这样,它会从在我的本地数据库中发送消息的用户那里获取数据,并将它们显示在带有v-for 循环的列表中。
数据是头像、姓名、姓氏和城市。在此数据下方会显示一个消息框,供每个用户显示他们来自 firebase 的消息。
这一切都很好。我的问题是,当我从 FB 获取消息时,只会为所有用户显示最后一条用户消息:
如您所见,用户 uid = 2 有 3 条消息,而用户 uid = 3 有一条消息。但我只能在所有消息框中显示用户uid = 3 消息。
let app = new Vue({
el: '#app',
data() {
return {
memberData: {},
myMessages: [],
memberMessages: [],
myID: userID,
messages: ''
}
},
mounted() { },
created: function () {
this.getAllMessages();
},
methods: {
scrollBox: function () {
let messagebox = document.querySelector('#messages-container');
messagebox.scrollTop = messagebox.scrollHeight;
},
getAllMessages: function () {
console.log(this.myID);
let distinct = '';
firebase.firestore().collection('private-messages')
.where('memberID', '==', `${this.myID}`)
.orderBy('date')
.onSnapshot(res => {
let members = [];
res.forEach(doc => {
members.push(doc.data().uid);
});
distinct = Array.from(new Set(members));
// console.log(distinct);
this.getUserToTalk(distinct);
});
},
getMessages: function(memberID){
// console.log(memberID);
firebase.firestore().collection('private-messages').where('uid', '==', `${memberID}`).orderBy('date')
.onSnapshot(res => {
let messages = [];
res.forEach(doc => {
messages.push(doc.data());
});
this.memberMessages = messages;
console.log(this.memberMessages);
});
},
getUserToTalk: function (memberID) {
// console.log(memberID);
axios.post('http://localhost/backend/getMemberToTalk.php', {
"token": token,
"whoToTalkTo": memberID
}).then(response => {
if (response.data != "Error getting user data") {
this.memberData = response.data;
this.memberData.forEach(res => {
let id = res.memberID;
// console.log(id);
this.getMessages(id);
});
// console.log(this.memberData);
} else {
console.log(response.data);
}
}).catch(error => {
console.log(error);
});
},
sendMessage: function (memberID) {
$('#messages_form').on('submit', (e) => {
e.preventDefault();
let message = this.messages;
if (!message.trim()) return;
console.log(message);
this.messages = '';
console.log(memberID);
...
});
}
},
mounted() {
},
});
html:
<div id="app" class="content-wrapper">
<div class="container-fluid">
<div class="row messages-row" v-for="(item, index) in memberData" :key="index">
<div class="col-md-4 col-12">
<div class="messages-profile-infos">
<div class="messages-profile-infos-img img-fluid"
v-bind:style="{'background-image': 'url(http://localhost/backend/clients/'+item.memberProfileImg + ')' }">
</div>
<div class="messages-profile-infos-text">
<p>{{ item.memberName }} {{ item.memberLastname }}</p>
<p>{{ item.memberCity }} - {{ item.memberState }}</p>
</div>
</div>
</div>
<div class="col-md-2 col-12">
<div class="messages-btns">
<button class="btn trade-btn" onclick="showConversation()">Messages</button>
</div>
</div>
<!-- conversation box -->
<div class="conversation-container">
<div id="messages-container" class="messages-container" :key="item.memberID">
<!-- <div v-for="message in allMessages" class="d-flex justify-content-start">
<span class="badge badge-pill badge-primary">{{ message.message }}</span>
</div> -->
<!-- actually testing with this one -->
<div v-if="item.memberID == message.uid" v-for="message in memberMessages" class="d-flex justify-content-start">
<span class="badge badge-pill badge-primary">{{ message.message }}</span>
</div>
<!-- <div v-for="message in myMessages" class="d-flex justify-content-end">
<span class="badge badge-pill badge-secondary">{{ message.message }}</span>
</div> -->
<!-- <div v-for="message in myMessages" class="d-flex" :class="[message.uid != myID ?'justify-content-start':'justify-content-end']">
<span class="badge badge-pill" :class="[message.uid != myID ?'badge-primary':'badge-secondary']">{{ message.message }}</span>
</div> -->
</div>
<div class="message-typing-container">
<form id="messages_form" action="" method="POST">
<div class="typing-container">
<input id="message" v-model="messages" type="text" class="message-typing" autocomplete="off" />
<input class="send-message" type="submit" value="Send" @click="sendMessage(item.memberID)" />
</div>
</form>
</div>
</div>
<hr />
</div>
是否可以将每条消息显示给对应的用户?
【问题讨论】:
标签: javascript firebase vue.js google-cloud-firestore