Angular句柄聊天私信

时间:2015-09-28 15:44:51

标签: angularjs angular-ui-router

我想处理聊天私信,所以我有2项服务:

  • 连接到服务器并返回套接字的ChatSocket
  • ChatHistory,用于在地图中保留每个私人聊天会话的聊天消息

在我的ChatSocket服务中,我会收听聊天私信,并将其添加到聊天记录中:

.factory('ChatSocket', function (ChatHistory) {
    var socket = io.connect(/* ... */);
    socket.on('priv_msg', function (data) {
        ChatHistory.push(data.user, data.msg);
    });
 });

我也使用了角度ui路由器,所以我可以通过这种方式拥有多个聊天“窗口”:

.config(function ($stateProvider) {
    $stateProvider.state('app.chat', {
        url: '/chat/:uid',
        views: {
            'content': {
                templateUrl: 'templates/chat.html',
                controller: function ($scope, $stateParams, ChatHistory) {
                    $scope.messages = ChatHistory.get($stateParams.uid);
                    /*
                      This returns an array that looks like: 
                      [ 
                          { nickname: 'myself', msg: 'hello' },
                          { nickname: 'someone', msg: 'hi' },
                          { nickname: 'myself', msg: 'how r u?' },
                      ] 
                    */
                }
             }
        }
    }
});

这很有效,除了因为$ scope.messages在外部服务中更新,我真的不知道在哪里调用$ apply。

当然我可以在控制器本身的“priv_msg”事件中添加一个监听器并在那里调用$ apply,但这看起来有点矫枉过正:

ChatSocket.on('priv_msg', function (data) {
    if (data.user.id == $stateParams.id) {
        $scope.$apply();
    }
});

知道如何更新消息吗?我的解决方案可能是正确的,但我对角度有点新意,所以可能有更好的方法来实现这一点,所以我完全接受任何建议/例子。

1 个答案:

答案 0 :(得分:1)

进行此更改:

svg[i]
.append("line")
.attr("x1",30)
.attr("y1",20)
.attr("x2",11)
.attr("y2",1)
.style("stroke", "black")

factory('ChatSocket', function ($rootScope, ChatHistory) {
    var socket = io.connect(/* ... */);
    socket.on('priv_msg', function (data) {
        ChatHistory.push(data.user, data.msg);
        $rootScope.$broadcast('priv_msg/' + data.user.id, data);
    });
 });

虽未测试,但可能是印刷错误。