2014-10-29 6 views
0

Я новичок в ионной, но я бы попробовал преобразовать свое старое приложение в эту мощную структуру. Я попытаюсь использовать google maps api на загруженной странице шаблона.Вставка google maps api в ионный шаблон страницы

это мой app.js

angular.module('starter', ['ionic', 'starter.controllers']) 
.run(function($ionicPlatform) { 
    $ionicPlatform.ready(function() { 
    if(window.cordova && window.cordova.plugins.Keyboard) { 
     cordova.plugins.Keyboard.hideKeyboardAccessoryBar(true); 
    } 
    if(window.StatusBar) { 
     StatusBar.styleDefault(); 
    } 
    }); 
}) 

.config(function($stateProvider, $urlRouterProvider) { 
    $stateProvider 

    .state('app', { 
     url: "/app", 
     abstract: true, 
     templateUrl: "templates/menu.html", 
     controller: 'AppCtrl' 
    }) 
    .state('app.home', { 
     url: "/home", 
     views: { 
     'menuContent' :{ 
      templateUrl: "templates/home.html" 
     } 
     } 
    }) 
    .state('app.mappa', { 
     url: "/mappa", 
     views: { 
     'menuContent' :{ 
      templateUrl: "templates/mappa.html", 
      controller: 'MarkerRemoveCtrl' 
     } 
     } 
    }) 
    .state('app.search', { 
     url: "/search", 
     views: { 
     'menuContent' :{ 
      templateUrl: "templates/search.html" 
     } 
     } 
    }) 
    .state('app.registrati', { 
     url: "/registrati", 
     views: { 
     'menuContent' :{ 
      templateUrl: "templates/registrati.html" 
     } 
     } 
    }) 

    .state('app.browse', { 
     url: "/browse", 
     views: { 
     'menuContent' :{ 
      templateUrl: "templates/browse.html" 
     } 
     } 
    }) 
    .state('app.playlists', { 
     url: "/playlists", 
     views: { 
     'menuContent' :{ 
      templateUrl: "templates/playlists.html", 
      controller: 'PlaylistsCtrl' 
     } 
     } 
    }) 
    .state('app.single', { 
     url: "/playlists/:playlistId", 
     views: { 
     'menuContent' :{ 
      templateUrl: "templates/playlist.html", 
      controller: 'PlaylistCtrl' 
     } 
     } 
    }) 
    .state('app.prova', { 
     url: "/prova", 
     views: { 
     'menuContent' :{ 
      templateUrl: "templates/prova.html" 
     } 
     } 
    }); 
    $urlRouterProvider.otherwise('/app/home'); 
}); 

и это мой controller.js

angular.module('starter.controllers', []) 

.controller('AppCtrl', function($scope, $ionicModal, $timeout) { 
    $scope.loginData = {}; 
    $ionicModal.fromTemplateUrl('templates/login.html', { 

    scope: $scope 
    }).then(function(modal) { 
    $scope.modal = modal; 
    }); 

    $scope.closeLogin = function() { 
    $scope.modal.hide(); 
    }; 

    $scope.login = function() { 
    $scope.modal.show(); 
    }; 

    $scope.doLogin = function() { 
    console.log('Eseguo la login', $scope.loginData); 

    $timeout(function() { 
     $scope.closeLogin(); 
    }, 1000); 
    }; 
}) 

.controller('PlaylistsCtrl', function($scope) { 
    $scope.playlists = [ 
    { title: 'Reggae', id: 1 }, 
    { title: 'Chill', id: 2 }, 
    { title: 'Dubstep', id: 3 }, 
    { title: 'Indie', id: 4 }, 
    { title: 'Rap', id: 5 }, 
    { title: 'Cowbell', id: 6 } 
    ]; 
}) 

.controller('PlaylistCtrl', function($scope, $stateParams) { 
}) 

.controller('MarkerRemoveCtrl', function($scope, $ionicLoading) { 
    $scope.positions = [{ 
    lat: 43.07493, 
    lng: -89.381388 
    }]; 
    $scope.$on('mapInitialized', function(event, map) { 
    $scope.map = map; 
    }); 
    $scope.centerOnMe= function(){ 
    $scope.positions = []; 

    $ionicLoading.show({ 
     template: 'Loading...' 
    }); 
    navigator.geolocation.getCurrentPosition(function(position) { 
     var pos = new google.maps.LatLng(position.coords.latitude, position.coords.longitude); 
     $scope.positions.push({lat: pos.k,lng: pos.B}); 
     console.log(pos); 
     $scope.map.setCenter(pos); 
     $ionicLoading.hide(); 
    }); 
    }; 
}); 

, а затем это мой index.html

<html> 
<head> 
<meta charset="utf-8"> 
<meta name="viewport" content="initial-scale=1, maximum-scale=1, user-scalable=no, width=device-width"> 
<title></title> 
<link href="css/ionic.app.css" rel="stylesheet"> 
<link href="css/app.css" rel="stylesheet"> 
<script src="lib/ionic/js/ionic.bundle.js"></script> 
<script src="cordova.js"></script> 
<script src="js/app.js"></script> 
<script src="js/controllers.js"></script> 
<script src="http://maps.google.com/maps/api/js"></script> 
<script src="http://rawgit.com/allenhwkim/angularjs-google-maps/master/build/scripts/ng-map.min.js"></script> 
</head> 
<body ng-app="starter"> 
<ion-nav-view></ion-nav-view> 
</body> 
</html> 

Как вы понимаете, я если я нажму кнопку «mappa», я открою шаблон mappa.html и загружу карту!

mappa.html

<ion-view ng-controller="MarkerRemoveCtrl"> 
<ion-content scroll="false"> 
    <div class="mapWrap" data-tap-disabled="true"> 
    <map center="43.07493,-89.381388" zoom="15"> 
     <!-- ngRepeat: pos in positions --> 
     <marker ng-repeat=" pos in positions" position="{{pos.lat}},{{pos.lng}}"></marker> 
    </map> 
    </div> 
</ion-content> 
</ion-view> 

Но ничего не случится! Я попробую поместить код mappa.html в индекс, и все работает отлично!

Вопрос: можно загружать карты на других страницах шаблона или только на главной странице? И как?

UPDATE РЕШЕНИЕ

Ok я решил мою проблему так просто вызов Init()

это maps.html

<ion-view title="MAPPA" ng-init="init()"> 
    <ion-nav-bar class="bar-energized"></ion-nav-bar> 
    <ion-content> 
    <div id="map" data-tap-disabled="true"></div> 
    </ion-content> 
    <ion-footer-bar class="bar-dark"> <a ng-click="centerOnMe()" class="button button-icon icon ion-navigate">Dove mi trovo</a> </ion-footer-bar> 
</ion-view> 

И это контроллер:

//MAPPE 
.controller('mapCtrl', function($scope, $ionicLoading, $compile) { 
     $scope.init = function() { 
     var myLatlng = new google.maps.LatLng(43.07493,-89.381388); 
     var mapOptions = { 
      center: myLatlng, 
      zoom: 16, 
      mapTypeId: google.maps.MapTypeId.ROADMAP 
     }; 
     var map = new google.maps.Map(document.getElementById("map"), 
      mapOptions); 

     //Marker + infowindow + angularjs compiled ng-click 
     var contentString = "<div><a ng-click='clickTest()'>Clicca qui!</a></div>"; 
     var compiled = $compile(contentString)($scope); 
     var infowindow = new google.maps.InfoWindow({ 
      content: compiled[0] 
     }); 
     var marker = new google.maps.Marker({ 
      position: myLatlng, 
      map: map, 
      title: 'Uluru (Ayers Rock)' 
     }); 
     google.maps.event.addListener(marker, 'click', function() { 
      infowindow.open(map,marker); 
     }); 
     $scope.map = map; 
    }; 
    // google.maps.event.addDomListener(window, 'load', initialize); 
    $scope.centerOnMe = function() { 
     if(!$scope.map) {return;} 

     $scope.loading = $ionicLoading.show({ 
      content: 'Getting current location...', 
      showBackdrop: false 
     }); 

     navigator.geolocation.getCurrentPosition(function(pos) { 
      $scope.map.setCenter(new google.maps.LatLng(pos.coords.latitude, pos.coords.longitude)); 
      $scope.loading.hide(); 
     }, function(error) { 
      alert('Unable to get location: ' + error.message); 
     }); 
    }; 
    $scope.clickTest = function() { 
     alert('Example of infowindow with ng-click') 
    }; 
}) 

Для меня все нормально, и при нажатии fi правильную позицию и показать на картах! спасибо!

+0

FYI: этот плагин поможет вам внедрить собственную карту Google в ваше приложение. Многие пользователи ионной инфраструктуры используют этот плагин. https://github.com/wf9a5m75/phonegap-googlemaps-plugin – wf9a5m75

ответ

0

Как я вижу, вы используете библиотеку JavaScript Google Maps, если вы используете API v3, тогда вам нужно указать API-ключ, если нет, то вы можете попробовать использовать плагин PhoneGap для родных карт Google, которые будут загружаться гораздо быстрее на мобильных устройствах устройства.

Код, который вы разместили, выглядит немного странным для меня, вы можете опубликовать более простую версию здесь. Но я не вижу нигде в вашем коде, что вы устанавливаете карту для загрузки в mapWrap div, вы обязательно должны это сделать.