2016-03-22 19 views
1

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=[] 
+0

[değiştir] Bir [MCVE] Bu azaltmak için tıklayın. – davidism

+0

@davidism bu daha mı iyi? – sebenalern

cevap

0

Sorunumu çözdüğüm yol açısal yuva kütüphanesi kullanmaktı. Hangi olayların tekrarlanmasını önlemek için olay işleyicilerinin çoğaltılmasını durdurmak için bir forward() işlevi sağlar. Ayrıca şimdi anladım ki MPA sayfa anahtarındaki soketleri yok eder ve SPA yapmaz. Prizio kodunu sadece bir kez çağrılacak olan daha yüksek bir modülde yerleştirmenizi tavsiye ederim. bir açıklama daha için buraya bakınız:

https://stackoverflow.com/a/36223423/3103677

İlgili konular