2013-10-04 1 views
5

J'essaye de migrer un simple projet de Google Maps (littéralement fait d'un exemple sur leur site) vers un projet AngularJS. Permettez-moi de préface en disant que je suis nouveau à la fois angularJS et web dev, alors s'il vous plaît soyez gentil :) J'ai un projet simple au https://github.com/eroth/angular-web-app (fichiers principaux ci-dessous) où je vais à partir d'un commit initial en utilisant un tutoriel Google Maps sur pour essayer de le convertir en application AngularJS, mais je n'ai pas réussi à le faire fonctionner, bien que j'ai vérifié que ma fonction $scope.init() dans mon fichier MapController.js est appelée à partir de mon fichier map.html.Essayer d'obtenir un exemple simple de Google Maps pour travailler avec AngularJS

Ma question est double: est-ce que quelque chose ne va pas avec mon code, ou ai-je besoin de quelque chose comme ça (qui semble être très bon): http://nlaplante.github.io/angular-google-maps/? Je travaille sur l'intégration de ceci dans mon projet sur une autre branche, mais j'essaye de comprendre si c'est un problème avec mon code existant, ou si j'avais besoin de quelque chose comme cette bibliothèque pour le faire fonctionner avec AngularJS. Si c'est le dernier, pourquoi? S'excuse d'avance si c'est une erreur extrêmement simple que je commets; Comme je l'ai dit, je suis assez nouveau dans tout ça, même si j'ai suivi quelques tutoriels AngularJS et ça me semble génial.

Ceci est mon fichier map.html:

<!DOCTYPE html> 
<html> 
    <head> 
    <meta charset = "utf-8"> 
    <meta name="viewport" content="initial-scale=1.0, user-scalable=no" /> 

    <!-- INCLUDE REQUIRED THIRD PARTY LIBRARY JAVASCRIPT AND CSS --> 
    <script type="text/javascript" src="js/angular.min.js"></script> 
    <link rel="stylesheet" href="css/bootstrap.min.css"> 
    <link rel="stylesheet" href="css/bootstrap-responsive.min.css"> 

    <!-- INCLUDE APPLICATION SPECIFIC CSS AND JAVASCRIPT --> 
    <script type="text/javascript" 
     src="http://maps.googleapis.com/maps/api/js?sensor=true&language=en"> 
    </script> 
    <script type="text/javascript" src="js/web-app/app.js"></script> 
    <script type="text/javascript" src="js/web-app/controllers/mainController.js"></script> 
    <link rel="stylesheet" href="css/main.css"> 
    </head> 
    <body> 
    <div class="container main-frame" ng-app="WebApp" ng-controller ="mainController" ng-init="init()"> 
     <div id="map-canvas"/> 
    </div> 
    </body> 
</html> 

Et ceci est mon fichier MapController.js:

app.controller("mainController", function($scope, $http){ 
$scope.initialLocation; 
$scope.siberia = new google.maps.LatLng(60, 105); 
$scope.newyork = new google.maps.LatLng(40.7463, -73.9913); 
$scope.browserSupportFlag = new Boolean(); 
$scope.map; 
$scope.retina = window.devicePixelRatio > 1; 

$scope.init = function() { 
    var mapOptions = { 
     zoom: 13, 
     mapTypeId: google.maps.MapTypeId.ROADMAP 
    }; 

    console.log('In main init'); 

    //first test——map uses hard-coded location, next will get user's location and pull deals 
    $scope.map = new google.maps.Map(document.getElementById("map-canvas"), 
     mapOptions); 

    // Try W3C Geolocation (Preferred) 
    if (navigator.geolocation) { 
     $scope.browserSupportFlag = true; 
     navigator.geolocation.getCurrentPosition(function(position) { 
     $scope.initialLocation = new google.maps.LatLng(position.coords.latitude, position.coords.longitude); 
     var currentLat = position.coords.latitude; 
     var currentLon = position.coords.longitude; 
     $scope.map.setCenter($scope.initialLocation); 
     // performApiCall(currentLat, currentLon); 

     //definite custom map pin for user location & plot it on map 
     var pinColor = "5ea9ff"; 
     var pinImage = new google.maps.MarkerImage("http://chart.apis.google.com/chart?chst=d_map_spin&chld=0.6|0|" + pinColor + "|0|_|k", 
     new google.maps.Size(25, 60), 
     new google.maps.Point(0,0), 
     new google.maps.Point(10, 24)); 
     var marker = new google.maps.Marker({ 
      position: $scope.initialLocation, 
      map: $scope.map, 
      icon: pinImage, 
     }); 
     }, function() { 
     handleNoGeolocation($scope.browserSupportFlag); 
     }); 
    } 

    // Browser doesn't support Geolocation 
    else { 
     $scope.browserSupportFlag = false; 
     handleNoGeolocation($scope.browserSupportFlag); 
    } 

    function handleNoGeolocation(errorFlag) { 
     if (errorFlag == true) { 
     alert("Geolocation service failed."); 
     $scope.initialLocation = newyork; 
     } else { 
     alert("Your browser doesn't support geolocation. We've placed you in Siberia."); 
     $scope.initialLocation = siberia; 
     } 
     map.setCenter($scope.initialLocation); 
    } 
}; 

google.maps.event.addDomListener(window, 'load', $scope.init); 
}); 

Merci à l'avance pour toute aide!

Répondre

5

Il y a quelques problèmes avec votre code. D'abord, vous appelez déjà la fonction init() de votre étendue dans votre mainController en la définissant dans le DOM avec ng-init.

<div class="container main-frame" ng-app="WebApp" ng-controller ="mainController" ng-init="init()"> 

Ce qui signifie que vous n'avez pas besoin pour l'auditeur fenêtre pour être chargé d'appeler le $scope.init - parce que cela irait à la fonction et à son tour deux fois initialiser votre carte deux fois. Supprimez l'écouteur. Deuxièmement, il y a quelques cas où des variables sont appelées qui font partie de l'objet $ scope (newyork Ln 57, serbia Ln 60 et map Ln 62) - donc une erreur non définie sera générée. Enfin, vous devez définir une hauteur pour le conteneur div de votre carte dans le CSS pour voir réellement la carte. Pour ce qui est de la deuxième partie de votre question, je voudrais vraiment essayer d'utiliser ce qui est déjà construit. Je n'ai pas utilisé la bibliothèque à laquelle vous étiez lié, mais si vous dites que c'est très bien, pourquoi essayer de réinventer la roue?

Questions connexes