It would help if you included a bit more of your code because there's a right way and a wrong way to do an $on(), and your shorthand would be the wrong way. I saw somebody once who thought this returned a promise and was trying to use .then() on it, and that won't work. It takes a callback:
$rootScope.$on('MyEvent', function(myParam) {
alert(myParam);
});
Separately, if you're doing pub/sub type work pay attention to the different between $emit and $broadcast. It's important for efficiency reasons, and if you don't need to actually use $broadcast you might want to reconsider it. $broadcast will send the message on that scope plus all child scopes. That means Angular needs to iterate recursively through every scope ever made to look for listeners for the event. If you use a lot of directives (many of those have scopy) and ngRepeats, you could have thousands of these!
Typically you use $broadcast when you want to put something out within a specific scope and its children deliberately, like when you're posting events between siblings in a data table row or something like that. (Hover effects, data updates to the row, that kind of thing...)
What you can do instead is use $emit. This works the same way (you still use $on to listen for it) but this time it goes up the scope chain. That means if you start it on $rootScope it will just hit one quick list of listeners and stop there - it's extremely fast and efficient if you're registering your $on() events at the same level. In that case you would use $rootScope.$on() instead of $scope.$on()... but the efficiency gain is worth it!