我想处理聊天私信,所以我有2项服务:
在我的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();
}
});
知道如何更新消息吗?我的解决方案可能是正确的,但我对角度有点新意,所以可能有更好的方法来实现这一点,所以我完全接受任何建议/例子。
答案 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);
});
});
虽未测试,但可能是印刷错误。