Although from a high level, I agree with the answer by bmleite ($rootScope exists to be used, and using $watch appears to work for your use case), I want to propose an alternative approach.
Use $rootScope.$broadcast
to push changes to a $rootScope.$on
listener, which would then recalculate your c
value.
This could either be done manually – i.e. when you would be actively changing a
or b
values, or possibly even on a short timeout to throttle the frequency of the updates. A step further from that would be to create a ‘dirty’ flag on your service, so that c
is only calculated when required.
Obviously such an approach means a lot more involvement in recalculation in your controllers, directives etc – but if you don’t want to bind an update to every possible change of a
or b
, the issue becomes a matter of ‘where to draw the line’.