You are missing $scope.$apply().
Whenever you touch anything from outside of the Angular world, you need to call $apply, to notify Angular. That might be from:
- xhr callback (handled by $http service)
setTimeoutcallback (handled by$deferservice)- DOM Event callback (handled by directives)
In your case, do something like this:
// inject $rootScope and do $apply on it
angular.service('Channel', function($rootScope) {
// ...
return {
init: function(channelId, clientId) {
// ...
socket.onmessage = function(msg) {
$rootScope.$apply(function() {
that.publish(args[0], args[1]);
});
};
}
};
});