Search code examples
angularjsionic-frameworkng-map

Can't center google map with ionic framework and ngMap


I'm using Ionic Framework b14, and the latest ngmap,

I have a view that shows the map but when I want to set the center it does not show the coordinates I'm getting from a service.

(function() {

  var injectParams = ['$scope', '$stateParams', 'storeFactory'];
  var StoreController = function($scope, $stateParams, storeFactory) {
    var id = $stateParams.storeId;
    $scope.store;


    storeFactory.getStore(id)
      .success(function(store) {
        $scope.store = store;
      }).error(function(error) {
        $scope.status = ' ' + error.message;
      });


    $scope.$on('mapInitialized', function(event, map) {
      var myLatLng = new google.maps.LatLng(store.Latitude, store.Longitud);
      map.setCenter(myLatLng);

    });

  };

  StoreController.$inject = injectParams;

  angular.module('elizondo').controller('StoreController', StoreController);

}());

I suppose is has to be something with the time it takes the server to respond, but I have no idea how to fix it, any help you can give me.

thanks.


Solution

  • You are correct, the mapInitialized listener function will execute before the success callback from getStore.

    You can save the map from the listener function in a variable and use that in your callback:

    var map;
    
    $scope.$on('mapInitialized', function(event, m) {
      map = m;
    });
    
    storeFactory.getStore(id).success(function(store) {
    
      $scope.store = store;
    
      var myLatLng = new google.maps.LatLng(store.Latitude, store.Longitud);
      map.setCenter(myLatLng);
    });
    

    If your map directive scope is the same as the StoreController scope, for example:

    <div ng-controller="StoreController">
      <map zoom="8"></map>
    </div>
    

    Then the map object will already be available on $scope within the controller so then you can skip the mapInitialized listener function (unless you are using it for something else as well) and just do:

    storeFactory.getStore(id).success(function(store) {
    
      $scope.store = store;
    
      var myLatLng = new google.maps.LatLng(store.Latitude, store.Longitud);
      $scope.map.setCenter(myLatLng);
    });