2016-04-05 102 views
0

當用戶加入時,我發回一個對象暱稱socketid。然後,我可以顯示所有用戶併發送消息。Socket.io + Angular - 發送私人消息

我想要做的是當用戶的名字被點擊時,只發送一條消息給該用戶。這是一個完整的回購chat app using socket.io

編輯

我更新這只是要求對如何抓住或正確過濾提取從我的數組,它包含一個對象socketid一些幫助。

我使用這個基礎上的click事件正確的用戶過濾:

$scope.sendLike = function(e) { 
    var toLike = $scope.users.filter(function(e) { 
    return e.nickname 
    }); 
    var likeObj = { 
    from: $scope.mynickname, 
    like: toLike 
    } 
    socket.emit('send-like', likeObj); 
} 

我回來我的用戶一個數組,看起來像:

[ { nickname: 'me', socketid: '/#nadkl897dasd' } ] 

我需要只返回我的價值socketid

+0

您可以讓誰點擊了名的用戶創建一個新的房間,併發送其他用戶,該用戶啓動一個私人會議 – Jer

+0

感謝的通知,也許我會嘗試這樣的事情,如果我不能以這種方式解決問題。 – venturz909

回答

0

我開發了一個類似的應用程序,下面是幾個幫助很多的鏈接 -

http://www.tamas.io/advanced-chat-using-node-js-and-socket-io-episode-1/

https://www.youtube.com/watch?v=k8o8-Q_-Qfk&ebc=ANyPxKo9fyO9bAywLGR9_p-_IcmkuQMK8Rfrk84qCON25JXlRReI8z3_5Qir9U1QNp6Sgm1RVkFfG-RHJ2y7ApVqd5gRVTarAQ#t=2.797

下面是我用的代碼:

var express = require('express'), 
http = require('http'), 
app = express(), 
server = http.createServer(app), 
io = require('socket.io').listen(server), 
users = {}; 

server.listen(3002); 
console.log(__dirname) 

app.get('/', function (req, res) { 

res.sendFile(__dirname + '/index.html') 
}); 

io.sockets.on('connection', function (socket) { 

socket.on('new user', function (data, callback) { 
    if (data in users) 
     callback(false); 
    //if (data === 'rahul') { 
    // socket.disconnect('unauthorized'); // for unauthorised users 
    // console.log('unauthorized'); 
    //} 
    else { 

     callback(true); 
     socket.nickname = data; 
     users[socket.nickname] = socket; 
     updateNicknames() 
    } 
}); 

socket.on('disconnect', function (data) { 
    if (!socket.nickname) return; 

    console.log('disconnect' + users[socket.nickname]); 
    delete users[socket.nickname]; 
    updateNicknames() 

}); 

function updateNicknames() { 
    io.sockets.emit('username',Object.keys(users)) 
} 

socket.on('send message', function (data) { 
    //io.sockets.emit('new message', data); // used to send to everyone 
    var ind = data.indexOf(' '); 
    if(ind !== -1){ 
     var name = data.substring(0, ind); 
     console.log(name); 
     var msg = data.substring(ind + 1); 
     console.log(msg); 
     if(name in users){ 
      users[name].emit('whisper',{msg:msg, nick:socket.nickname}); 
     } 
    } 
}); 
}); 

做讓我知道如果你需要更多的幫助。

0

爲了解決這個問題,我最終使用了lodash方法。用於處理數組/對象的大型庫。這是使用ng-lodash幫助程序庫。

$scope.sendLike = function(e) { 
    var toLike = $scope.users.filter(function(f) { 
    if(e.socketid === f.socketid) 
    return f.socketid; 
    }); 
    // $scope.socketid = e.socketid; 
    var result = lodash.get(toLike, '[0].socketid'); 
    var likeObj = { 
    from: $scope.mynickname, 
    like: result 
    } 
    socket.emit('send-like', likeObj); 
} 

我的HTML

 <li class="user" 
     ng-repeat="user in users track by $index"> 
     <a href="#" ng-click="sendLike(user)"> 
相關問題