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)
setTimeout
callback (handled by$defer
service)- 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]);
});
};
}
};
});