Angularjs ve socketio chat uygulaması ile çalıştığım konu, başka bir kullanıcıya mesaj gönderirken, mesajın görüntülenmesi için olay işleyicisinin birden fazla kez tetiklenmesidir. Aynı mesaj ekranda birden fazla kez görüntüleniyor, sadece mesajı bir kez görüntülemeyi istiyorum. Birisi bunun neden olduğunu ve bu sorunu nasıl düzeltebileceğini açıklayabilir.Angularjs SPA + Flask-Socketio etkinlikleri birden çok kez tetikleniyor
İstemci tarafı kodum. Sayfaları değiştirmek için ngRoute kullanıyorum ve sayfaları değiştirirken verileri korumak için bir hizmet kullanıyorum.
// This method populates the chatbox on startup
// Also it is emitted to on server side to display a new message
socket.on("populateMessagesArchived", function (message) {
$scope.tempArray = [message[0], message[1], message[2]];
$scope.messages.push($scope.tempArray);
$scope.$apply();
$scope.tempArray = [];
$scope.message="";
});
// When a users sends a message, this is invoked
// this function gets the roomNum and message where roomNum corresponds to the roomNum where user sent message
$scope.getMessage = function(roomNum, message) {
$scope.tempArray = [roomNum, message, $scope.username];
$scope.messages.push($scope.tempArray);
socket.emit("storeMessagesInDatabase", {"uuid": $scope.uuid, "message": message, "roomNum": roomNum, "username": $scope.username});
var element = document.getElementById('msgpane');
element.scrollTop = element.scrollHeight;
$scope.tempArray = [];
$scope.message="";
};
Sunucu Kodu: Temelde bir postgresql veritabanına mesaj ekler. Ve giriş kontrolü ve kayıt işlemlerini gerçekleştirir. Ama sorunun burada olduğunu düşünmüyorum. Fark ettiğim, sayfaları değiştirdiğimde başka bir soket bağlantısı yapıldığında. Prizin bağlantısı sayısı, kaç mesajın yazdırılacağını gösterir. Ama bu sorunu nasıl çözeceğimi bilmiyorum. Herhangi bir yardım büyük takdir edilecektir.
@socketio.on('userLoggedIn', namespace='/iss')
def loggedIn(user):
userData = user
connect = connectToDB()
cursor = connect.cursor(cursor_factory=psycopg2.extras.DictCursor)
cursor.execute("""select uuid, username from users WHERE username = %s AND password = crypt(%s, password);""", (userData['username'], userData['password']))
#query1 = cursor.mogrify("""select * from users WHERE username = %s AND password = 'crypt(%s, password)';""", (userData['username'], userData['password']))
query = cursor.fetchone()
if query is not None:
# Here we get the messages from the database and pass them to client side
tempArray = retrieveMessagesFromDB()
print tempArray
emit('userAuthorized', query["uuid"], namespace='/iss')
for message in tempArray:
// emitted to client side to populate the chat room on login of a user
emit("populateMessagesArchived", message, namespace='/iss')
else:
emit('userNotAuthorized', namespace='/iss')
#
# retrieves the messages from the database to populate the chat rooms
#
def retrieveMessagesFromDB():
connect = connectToDB()
cursor = connect.cursor(cursor_factory=psycopg2.extras.DictCursor)
cursor.execute("""select messages.room_num, messages.message, users.username from users join messages on users.uuid = messages.uuid;""")
query = cursor.fetchall()
return query
#
# storeMessagesInDatabase - stores messages in the database
#
@socketio.on('storeMessagesInDatabase', namespace='/iss')
def storeMessagesInDatabase(userInfo):
# userInfo is Json and we set it equal to tempDict
tempDict=userInfo
tempArray=[]
tempArray.append(tempDict["roomNum"])
tempArray.append(tempDict["message"])
tempArray.append(tempDict["username"])
connect = connectToDB()
cursor = connect.cursor()
try:
cursor.execute("""insert into messages (uuid, message, room_num) values (%s, %s, %s);""", (str(tempDict["uuid"]), tempDict["message"], str(tempDict["roomNum"])))
except:
connect.rollback()
connect.commit()
# Messages emitted back to client to be outputted on screen
emit("populateMessagesArchived", tempArray, namespace='/iss', broadcast=True)
tempArray=[]
[değiştir] Bir [MCVE] Bu azaltmak için tıklayın. – davidism
@davidism bu daha mı iyi? – sebenalern