In an AngularJS application (main) I have an iframe
inside which there is another AngularJS application (iframe) also under my control. I would like to share data between two services, one in the main application and one in the iframe application. They both need to read and write to the same object.
// main
// ... routes ...
views: { main: {
controller: function ($scope, serviceA) {
$scope.serviceA = serviceA;
},
templateUrl: 'iframe.html'
}
// ...
function ServiceA () {
this.sharedData; // exposed to controllers in main app
}
// ...
// iframe
// ...
function ServiceB () {
this.sharedData; // exposed to controllers in iframe app
}
// ...
When inside a controller in iframe application I managed to reference serviceA.sharedData
like this:
var self = this;
var parentScope = $window.parent.angular.element($window.frameElement).scope();
parentScope.$watch('serviceA.sharedData', function (newValue, oldValue) {
self.sharedData = newValue;
}
Can this be achieved and how?
I have read the following, but could not turn it into a solution, yet:
I managed to do something that works, and could be useful for you. It's not perfect but is a good start. Here is the code:
Parent page:
<div ng-controller="ParentController">
<h1>Hello, parent page!</h1>
<p><strong>Parent model:</strong></p>
<p>
<input type="text"
ng-model="data.foo"
placeholder="Enter the thing you want to share"/>
</p>
<p><strong>Parent result:</strong></p>
<p>{{ data.foo }}</p>
<iframe src="child-page.html" frameborder="0"></iframe>
</div>
Child page:
<div ng-controller="ChildController">
<h1>Hello, child page!</h1>
<p><strong>Child result:</strong></p>
<p>{{ data.foo }}</p>
</div>
app.js
var app = ng.module('myApp', []);
app.factory('DataService', ['$rootScope', '$window', function ($rootScope, $window) {
var // Variables
dataScope,
// Functions
getScope;
dataScope = $rootScope.$new(true);
getScope = function () {
return dataScope;
};
$window.DataService = {
getScope: getScope
};
return {
getScope: getScope
};
}]);
app.controller('ParentController', ['$scope', 'DataService', function ($scope, DataService) {
$scope.data = DataService.getScope();
}]);
app.controller('ChildController', ['$scope', '$window', '$interval', function (
$scope,
$window,
$interval
) {
$scope.data = $window.parent.DataService.getScope();
// makes a $scope.$apply() every 500ms. Without it, data doesn't change
$interval(ng.noop, 500);
}]);
All of this code leads to this:
The important part is $scope.data = $window.parent.DataService.getScope();
in the child controller. That's where it fetches the shared $scope.
Of course, all this works only if the parent & the iframe are under the same domain. Else, it becomes a whole other complicated story...
Hope this will help you.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With