As @Penman said, you should use a service (here, I used a factory).
A very simple use case is to have a service with a method that log something. Then we use this service from 2 different modules.
Here's how I did it :
index.html
<body>
<div ng-app="appOne">
<div ng-controller="appOneCtrl">
{{ name }} <button ng-click="log()">Log</button>
</div>
<div ng-app="appTwo">
<div ng-controller="appTwoCtrl">
{{ name }} <button ng-click="log()">Log</button>
</div>
</div>
</div>
</body>
script.js
// APP 1
const app1 = angular.module('appOne', ['appTwo']);
app1.controller('appOneCtrl', function($scope, $log, sharedFactory) {
$scope.name = 'App 1, ctrl 1';
$scope.log = () => {
$log.info('Click on log button from appOne');
sharedFactory.logMeSomething();
};
});
// -----------------------------------------
// APP 2
const app2 = angular.module('appTwo', []);
app2.controller('appTwoCtrl', function($scope, $log, sharedFactory) {
$scope.name = 'App 2, ctrl 2';
$scope.log = () => {
$log.info('Click on log button from appTwo');
sharedFactory.logMeSomething();
};
});
app2.factory('sharedFactory', function($log) {
return {
logMeSomething: () => {
$log.debug('Something logged from sharedFactory !');
}
};
});
Clicking on "Log 1" button displays :
Click on log button from appOne
Something logged from sharedFactory !
Clicking on "Log 2" button displays :
Click on log button from appTwo
Something logged from sharedFactory !
Here's a working Plunkr of my solution :
https://plnkr.co/edit/sgOKkh0eh0URPGIP9dZY?p=preview