Create factory to refresh badge in all views

I would check if in my app there are new msg, so I would create a factory or service to make every 5 sec an $http request and update a badge in all view of the app!
Is it possible?
Any ideas??

I’m trying this, but dont refresh!

var timer = $timeout(timeoutFunction, 5000);
   timer.then(setNew(), handleError);
  function timeoutFunction() {
    return;
  }
  
  function handleError() {
    console.log('Timer rejected');
  }

  function newMessageReceived(scope, callback) {
    callback(getNew());
    scope.$on('newMessageReceived', function() {
      callback(getNew());
    });
  }

  function getNew() {
    return $localstorage && $localstorage.message || undefined;
  }

  function setNew() {
    var user_id = $localstorage.get('user_id');
    return $http.post('http://www.digitalxp.it/appwork/include/check_msg.asp?id='+user_id)
      .success(function(data){
        $localstorage.message = data;
        $rootScope.$broadcast('newMessageReceived');
      })
      .error(function(){alert("Errore di comunicazione!")})
  }

  return {
    newMessageReceived: newMessageReceived
  };

Hey,

consider https://docs.angularjs.org/api/ng/service/$interval

You can create intervals or clear intervals.

I would create a service, where you can get your messages and in a controller i would create a interval which calls this method in a specific time.

If you have authorization you can clear the interval on logout.

I have a basecontroller for all my “loggedin”-views -> in that controller i create all background intervals.
And i provide two events where other views can trigger interval-cleaning or creation.

but with interval I could assign value for badge in all view, or only in view where the user is when interval find a new msg?

If you have that badge in all of your view, you should try to find a base-layout of your views.

For example you have in every view a headerbar/navbar with that badge -> you could create that layout with navbar in a base-template -> this is connected with the base controller.
This base template has an own ion-nav-view where the other views can hang in.

In this case it is enough to handle the new-message stuff in that basecontroller.

If you can not work with a base layout -> if the base-controller updates the value -> trigger an event with $scope.$broadcast to inform your views about it.

I change my script so:

.service('messageService', function($rootScope, $http, $localstorage, $timeout){
		return {
		getNew: function(callback){
			var user_id = $localstorage.get('user_id');
    		var timer;
			function myLoop(){
				timer = $timeout(function(){console.log( "Timeout executed")},5000);
				timer.then(
					function(){$http.post('http://www.digitalxp.it/appwork/include/check_msg.asp?id='+user_id)
					.success(function(data){callback(data)})
					.error(function(){alert("Errore di comunicazione!")});
					myLoop()},
					function(){console.log("Timer rejected!")}
					);
			}
    		myLoop();
		}}
})

and the controller is called by the sidemenu:

messageService.getNew(function(data) {
	if(data!=0){
		$scope.addNotification(data);
		$scope.counter = data
		} else {
		$scope.cancelAllNotification;
		$scope.counter = {}
		}
});

Could I use this script to assign to all $scope.counter (the badge) the value?
I think is possible with $scope.$broadcast…but how?

if you set your counter -> do not set it on the local sidemenu scope -> do it on the $rootScope

$rootScope.myNewMessageCounter = data;

try to use a unique key for your counter (because there could be another variable in another scope, that is called “counter” ;)).
Now if you use {{myNewMessageCounter}} in any template there should be your value (if it is not overwritten by another controller).

In your controllers you can use $rootScope.myNewMessageCounter.

If you do not want to put this value on the $rootScope you can trigger a custom event:

$rootScope.$broadcast('newMessage', data);

and in another controller
$scope.$on(‘newMessage’, function (event, data) {
console.log(data); // it should be your message data
});