Q:

Sharing data between controllers and dealing with update/change notifications

I'm trying to get my head around sharing data between multiple controllers, but couldn't find out yet how this is supposed to work (the angular way). I have create a Data service that look something like this:
angular.module('myapp.services')
  .service('DataSet', function($rootScope) {

  return {

    filter: function(filterMethod) {
      /// ... do async stuff
      $rootScope.$broadcast("Data::filtered");
    },

    brush: function(brushed) {
      /// ... do async stuff
      $rootScope.$broadcast("Data::brushed");
    },

    load: function() {
      /// ... do async stuff
      $rootScope.$broadcast("Data::loaded");
    }
  };
});

Next I want to reuse and update data from this service, so I use it in my controller as follows:
angular.module('myapp.controllers')
  .controller('FilterCtrl', function ($scope, $rootScope, DataSet) {

  $scope.safeApply = function(fn) {
    var phase = this.$root.$$phase;
    if(phase == '$apply' || phase == '$digest') {
      if(fn && (typeof(fn) === 'function')) {
        fn();
      }
    } else {
      this.$apply(fn);
    }
  };

  function updateBrushed() {
    $scope.safeApply(function() {
      $scope.brushed = DataSet.brushed;
    });
  };

  $scope.brushed = [];

  $scope.keepSelected = function() {
    DataSet.filter(DataSet.FilterMethod.KEEP);
  };

  $scope.removeSelected = function() {
    DataSet.filter(DataSet.FilterMethod.REMOVE);
  };

  $scope.$on('Data::brushed', updateBrushed);
  $scope.$on('Data::filtered', updateBrushed);
});

The problem I have is basically illustrated by the use of the saveApply call. Basically I got this code from here: https://coderwall.com/p/ngisma. What I don't understand though is why I need it. As far as I can see, I'm 'within' $angular when updating the DataSet service. Nevertheless, the view for the Filter controller doesn't get updated without a call to saveApply ($apply doesn't work at all because than I run into the apply already in progress issue).
So, basically my question boils down to: is the approach above a good way to share data, and if so how is notification of changes in the service supposed to work?
Update: Based on Julian Hollman his suggestion I came to the following solution: http://jsfiddle.net/Ljfadvru/7/. This more or less illustrates the full workflow I was working on, though some of it is automatically induced in the fiddle, as opposed to user-interaction based in my real application. What I like about this approach is that it only sends signals when all data is updated.
Working with references, as suggested by Ed Hinchliffe, is nice as well. However, I'm working on a web visualization framework and I'm expecting tens of thousands of items. Clearing arrays and pushing new elements (which seem to me the consequence of this proposal) is really not feasible (if I understand this paradigm well, it would also result in a re-rendering of my vis for every single change). I stand corrected though if there are suggestions for further improvement.

A:

$broadcast doesn't trigger an $apply and I bet your "async stuff" is not $http from angular.
So something happens outside of angular and angular doesn't know that something has changed.
In my opinion the best thing in that case is to write a wrapper for your async code and trigger $apply after date came back from the backend. Don't do it in the controller.

