Sunday, May 12, 2024
 Popular · Latest · Hot · Upcoming
164
rated 0 times [  171] [ 7]  / answers: 1 / hits: 33344  / 12 Years ago, mon, april 16, 2012, 12:00:00

Updating the model property has no effect on the view when updating the model in event callback, any ideas to fix this?



This is my service:



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 was added dynamically in the controller.



Controller:



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'];


View:



<div ng:controller=App.Controllers.ParticipantsController>      
<ul>
<li ng:repeat=participant in participants><label ng:bind=participant.name></label></li>
</ul>

<button ng:click=add('test')>add</button>
</div>


So the problem is that clicking the button updates the view properly, but when I get the message from the Channel nothings happens, even the add() function is called


More From » angularjs

 Answers
12

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

[#86211] Saturday, April 14, 2012, 12 Years  [reply] [flag answer]
Only authorized users can answer the question. Please sign in first, or register a free account.
keyonnaelled

Total Points: 35
Total Questions: 113
Total Answers: 99

Location: South Korea
Member since Fri, Sep 11, 2020
4 Years ago
keyonnaelled questions
Tue, Sep 14, 21, 00:00, 3 Years ago
Wed, Oct 14, 20, 00:00, 4 Years ago
Tue, Sep 8, 20, 00:00, 4 Years ago
Sat, Jul 11, 20, 00:00, 4 Years ago
;