Все директивы и сервисы ангуляра из коробки (например ng-click, сервисы $http, $timeout и другие) автоматически делают вызов $scope.$apply(). А если используются неангулярные методы типа вашего примера или события навешены голым яваскриптом или другой библиотекой(типа jQuery), то надо делать вызов $scope.$apply() самому, чтобы дать знать ангуляру, что данные изменились, и ему нужно обновить вьюхи, вызвать watch-функции и т.п. Почему это нужно делать написано здесь
www.codehint.ru/articles/2014-08-30_angular_apply_...