I have a directive, here is the code :
.directive('map', function() {
return {
restrict: 'E',
replace: true,
template: '<div></div>',
link: function($scope, element, attrs) {
var center = new google.maps.LatLng(50.1, 14.4);
$scope.map_options = {
zoom: 14,
center: center,
mapTypeId: google.maps.MapTypeId.ROADMAP
};
// create map
var map = new google.maps.Map(document.getElementById(attrs.id), $scope.map_options);
var dirService= new google.maps.DirectionsService();
var dirRenderer= new google.maps.DirectionsRenderer()
var showDirections = function(dirResult, dirStatus) {
if (dirStatus != google.maps.DirectionsStatus.OK) {
alert('Directions failed: ' + dirStatus);
return;
}
// Show directions
dirRenderer.setMap(map);
//$scope.dirRenderer.setPanel(Demo.dirContainer);
dirRenderer.setDirections(dirResult);
};
// Watch
var updateMap = function(){
dirService.route($scope.dirRequest, showDirections);
};
$scope.$watch('dirRequest.origin', updateMap);
google.maps.event.addListener(map, 'zoom_changed', function() {
$scope.map_options.zoom = map.getZoom();
});
dirService.route($scope.dirRequest, showDirections);
}
}
})
I would like to call updateMap()
on a user action. The action button is not on the directive.
What is the best way to call updateMap()
from a controller?
How to get a directive's controller in a page controller:
write a custom directive to get the reference to the directive controller from the DOM element:
use it in the page controller's html:
Use the directive controller in the page controller:
Note: the given solution works only for element directives' controllers (tag name is used to get the name of the wanted directive).
TESTED Hope this helps someone.
My simple approach (Think tags as your original code)
If you want to use isolated scopes you can pass a control object using bi-directional binding
=
of a variable from the controller scope. You can also control also several instances of the same directive on a page with the same control object.You can tell the method name to directive to define which you want to call from controller but without isolate scope,
Below solution will be useful when, you are having controllers (both parent and directive (isolated)) in 'controller As' format
someone might find this useful,
directive :
directive Controller :
html code :
Maybe this is not the best choice, but you can do
angular.element("#element").isolateScope()
or$("#element").isolateScope()
to access the scope and/or the controller of your directive.