A visão não é atualizada no AngularJS

Atualizando a propriedade do modelo não tem efeito sobre a visão ao atualizar o modelo no retorno de chamada do evento, alguma idéia para corrigir isso?

Este é o meu serviço:

angular.service('Channel', function() { var channel = null; return { init: function(channelId, clientId) { var that = this; channel = new goog.appengine.Channel(channelId); var socket = channel.open(); socket.onmessage = function(msg) { var args = eval(msg.data); that.publish(args[0], args[1]); }; } }; }); 

publish() function publish() foi adicionada dinamicamente no controlador.

Controlador:

 App.Controllers.ParticipantsController = function($xhr, $channel) { var self = this; self.participants = []; // here publish function is added to service mediator.installTo($channel); // subscribe was also added with publish $channel.subscribe('+p', function(name) { self.add(name); }); self.add = function(name) { self.participants.push({ name: name }); } }; App.Controllers.ParticipantsController.$inject = ['$xhr', 'Channel']; 

Visão:

 

Então, o problema é que clicar no botão atualiza a visão corretamente, mas quando eu recebo a mensagem do canal Nothings acontece, até mesmo a function add() é chamada

Você está perdendo $scope.$apply() .

Sempre que você tocar em algo de fora do mundo Angular, você precisará ligar $apply , para notificar Angular. Isso pode ser de:

  • xhr callback (manipulado pelo serviço $ http)
  • retorno de chamada setTimeout (manipulado pelo serviço $defer )
  • Retorno de chamada do evento DOM (manipulado por diretivas)

No seu caso, faça algo assim:

 // 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]); }); }; } }; }); 
Intereting Posts