【问题标题】:Angular Google Maps $scope issueAngular Google Maps $scope 问题
【发布时间】:2015-06-24 21:38:09
【问题描述】:

我正在尝试学习 Angular,并使用 Angular-Google-MapsAngular Seed

我只是想让地图显示出来,但我认为它没有接收纬度、经度和缩放参数,因此那里什么也没有。我没有在 Chrome 的 Web 开发人员检查器中显示任何错误。

我确实认为问题在于添加此内容

$scope.map = { center: { latitude: 45, longitude: -73 }, zoom: 8 };

在我的范围内,就像 angular-google-maps 文档所读到的那样。

如果我跳过上述说明并在我的 index.html 文件中执行此操作,它会起作用。

<ui-gmap-google-map center='{ latitude: 45, longitude: -73 }' zoom='zoom: 8'></ui-gmap-google-map>

这是我的 app.js 文件:

'use strict';

// Declare app level module which depends on views, and components
angular.module('myApp', [
  'ngRoute',
  'myApp.view1',
  'myApp.view2',
  'myApp.view3',
  'myApp.version',
  'uiGmapgoogle-maps'
])
.controller('mapCtrl', function($scope, uiGmapGoogleMapApi){
    $scope.map = { center: { latitude: 45, longitude: -73 }, zoom: 8 };
})
.config(['$routeProvider', function($routeProvider) {
    $routeProvider.otherwise({redirectTo: '/view1'});
}]);

这是我的 index.html 文件:

<!DOCTYPE html>
<!--[if lt IE 7]>      <html lang="en" ng-app="myApp" class="no-js lt-ie9 lt-ie8 lt-ie7"> <![endif]-->
<!--[if IE 7]>         <html lang="en" ng-app="myApp" class="no-js lt-ie9 lt-ie8"> <![endif]-->
<!--[if IE 8]>         <html lang="en" ng-app="myApp" class="no-js lt-ie9"> <![endif]-->
<!--[if gt IE 8]><!--> <html lang="en" ng-app="myApp" class="no-js"> <!--<![endif]-->
<head>
  <meta charset="utf-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <title>Project R</title>
  <meta name="description" content="">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <link rel="stylesheet" href="bower_components/html5-boilerplate/css/normalize.css">
  <link rel="stylesheet" href="bower_components/html5-boilerplate/css/main.css">
  <link rel="stylesheet" href="css/bootstrap-theme.min.css">
  <link rel="stylesheet" href="css/bootstrap.min.css">
  <link rel="stylesheet" href="app.css">
</head>
<body>
<ui-gmap-google-map id="map-container" center='map.center' zoom='map.zoom'></ui-gmap-google-map>

  <ul class="menu">
    <li><a href="#/view1">Add Memory</a></li>
    <li><a href="#/view2">Profile</a></li>
    <li><a href="#/view3">Search</a></li>
  </ul>

  <!--[if lt IE 7]>
      <p class="browsehappy">You are using an <strong>outdated</strong> browser. Please <a href="http://browsehappy.com/">upgrade your browser</a> to improve your experience.</p>
  <![endif]-->

  <div ng-view></div>

  <div>Angular seed app: v<span app-version></span></div>

  <script src='//maps.googleapis.com/maps/api/js?sensor=false'></script>

  <!-- In production use:
  <script src="//ajax.googleapis.com/ajax/libs/angularjs/x.x.x/angular.min.js"></script>
  -->
  <script src="bower_components/angular/angular.js"></script>
  <script src="bower_components/angular-route/angular-route.js"></script>
  <script src="app.js"></script>
  <script src="view1/view1.js"></script>
  <script src="view2/view2.js"></script>
  <script src="view3/view3.js"></script>
  <script src="https://code.jquery.com/jquery-1.11.2.min.js"></script>
  <script src="js/bootstrap.min.js"></script>
  <script src="components/version/version.js"></script>
  <script src="components/version/version-directive.js"></script>
  <script src="components/version/interpolate-filter.js"></script>
  <script src="bower_components/html5-boilerplate/js/vendor/modernizr-2.6.2.min.js"></script>
  <script src='bower_components/lodash/dist/lodash.min.js'></script>
  <script src='bower_components/angular-google-maps/dist/angular-google-maps.min.js'></script>
</body>
</html>

我的 app.css 文件包含以下样式:

#map-container{
  height:400px;
  width:100%;
  position: absolute;
    z-index: -1;
  left:0;
  top:0;
}
.ng-isolate-scope{
  height:400px;
  width:100%;
}

.angular-google-map{
  height:400px;
  width:100%;
}
.angular-google-map-container{
  position: absolute;
  height:400px;
  width:100%;
}

【问题讨论】:

    标签: angularjs google-maps-api-3 angularjs-scope


    【解决方案1】:
    /**
    * itSimpleGoogleMap Module
    *
    * Just a google maps api wrapper
    */
    
    (function(){
      'use strict';
    
      angular.module('itSimpleGoogleMap', [])
    
      .directive('itSimpleGoogleMap', function($compile, $timeout){
        // Runs during compile
        var _currentMarkers = [];
        var _overlays = [];
    
        var newdiv = document.createElement('div');
        newdiv.style.width = "100%";
        newdiv.style.height = "100%";
        var map = new google.maps.Map(newdiv, {
          center:  {lat: 41.90, lng: -87.65},
          zoom: 10,
          mapTypeId: google.maps.MapTypeId.SATELLITE
        });
    
        return {
          // name: '',
          // priority: 1,
          // terminal: true,
          scope: {
            markers:'=',
            overlays:'=',
            triggerResize:'='
          }, // {} = isolate, true = child, false/undefined = no change
          // controller: function(scope, $element, $attrs, $transclude) {},
          // require: 'ngModel', // Array = multiple requires, ? = optional, ^ = check parent elements
          // restrict: 'A', // E = Element, A = Attribute, C = Class, M = Comment
          // template: '',
          // templateUrl: '',
          // replace: true,
          // transclude: true,
          // compile: function(tElement, tAttrs, function transclude(function(scope, cloneLinkingFn){ return function linking(scope, elm, attrs){}})),
          link: function(scope, iElm) {
            iElm[0].appendChild(newdiv);
    
            _.each(_currentMarkers, function(marker){
              marker.setMap(null);
            })
            _.each(_overlays, function(overlay){
              overlay.setMap(null);
            })
    
            google.maps.event.trigger(map, 'resize');
    
    
            scope.$watch('triggerResize', function(){
              google.maps.event.trigger(map, 'resize');
            });
    
    
            $timeout(function(){
    
              var mapOptions = {
                center:  {lat: 41.90, lng: -87.65},
                zoom: 10
              };
    
    
              // scope.$watchCollection('options', function(){
              //   if(!scope.options || !map){
              //     return ;
              //   }
    
              //   map.setCenter({lat:scope.options.center.lat,lng:scope.options.center.lng});
              // });
    
    
              scope.$watch('overlays', function(){
                if(!scope.overlays || !map){
                  return ;
                }
    
                _.forEach(_overlays, function(curOverlay){
                  curOverlay.setMap(null);
                });
    
                _.forEach(scope.overlays, function(overlayData){
                  var newOverlay = new google.maps.KmlLayer({
                     url: overlayData,
                     map:map
                  });
                  _overlays.push(newOverlay);
                });
    
              });
    
              scope.$watchCollection('markers', function(){
                if(!scope.markers || !scope.markers[0] || !scope.markers[0].coords.latitude)
                {
                  return;
                }
    
                _.forEach(_currentMarkers, function(curMarker){
                  curMarker.setMap(null);
                  google.maps.event.clearInstanceListeners(curMarker);
                });
    
                _currentMarkers = [];
    
                var bounds = new google.maps.LatLngBounds();
    
                var infowindow = new google.maps.InfoWindow();
    
                if(scope.markers.length==0){
                  map.setCenter({lat: 41.90, lng: -87.65});
                  return;
                }
    
                _.forEach(scope.markers, function(markerData){
                  var marker = new google.maps.Marker({
                      position: new google.maps.LatLng(markerData.coords.latitude,markerData.coords.longitude),
                      map: map,
                      icon:markerData.icon
                      // title:markerData.data['Growing Site Name'].answer
                  });
    
                  bounds.extend(marker.position);
    
                  var infoWindowElement;
    
                  $compile(markerData.infoWindow)(scope, function(cloneElm){
                    infoWindowElement = cloneElm[0];
                  });
    
                  google.maps.event.addListener(marker, 'click', function() {
                    infowindow.close();
                    infowindow.setContent(infoWindowElement);
                    infowindow.open(map,marker);
                  });
                  _currentMarkers.push(marker);
                });
                map.fitBounds(bounds);
              });
    
            },100)
          }
        };
      });
    })();
    

    用法类似于:

    <it-simple-google-map
      overlays="model.mapOpts.overlays"
      markers="model.mapOpts.markers"
      trigger-resize="resizeMap">
    </it-simple-google-map>
    

    在我在这里的实现中,我实际上只创建了 1 个地图对象,并且只是在找到该指令的任何地方附加它,所以这不能在屏幕上使用多个,但这是一种对我的项目有益的优化。如果您将地图对象的创建移动到链接函数中,那么每次遇到编译指令时都会创建一个。

    当指令在不同页面上以不同的容器大小重复使用时,trigger-resize 是一种调用 maps 函数来调整自身大小的技巧。

    刚刚注意到我也只处理了一组标记,然后拟合边界作为设置位置的方法,但如果您有兴趣在此基础上进行构建,请告诉我并帮助添加要处理的部分适当地使用中心/缩放。

    【讨论】:

      【解决方案2】:

      您似乎没有在 html 中声明 ng-appng-controller。在您的代码开头尝试以下操作(并且显然在您希望该控制器的范围结束的任何地方关闭 div):

      <body ng-app="myApp">
          <div ng-controller="mapCtrl">
              <ui-gmap-google-map id="map-container" center='map.center' zoom='map.zoom'></ui-gmap-google-map>
      

      【讨论】:

      • 这就是问题所在......这让它起作用了。但是,在文档中,他们并没有要求 div 包含 ui-gmap-google-map 标签。根据他们在这里的文档,我不知道它是如何工作的:angular-ui.github.io/angular-google-maps/#!/use
      • 我相信正在发生的事情是,通过直接在 HTML 中提供值,您不再需要控制器,因此当您对其进行硬编码时它就可以工作。当您使用 map.center 之类的绑定从控制器中引入这些值时,就会出现问题,因为您显然需要那个控制器。
      • 这是真的,我假设并且文档可能假设您在路由定义中定义了控制器,因为这通常是最好的地方。老实说,仍然不会将此指令用作学习 Angular 的起点,文档中存在/肯定存在缺陷,并且对于大多数人的需求来说过于复杂。
      • @shaunhusain 我有兴趣查看您的指令。这个有很多错误。
      • @livi1717 我用我放在一起的基本谷歌地图包装器指令取消了我的答案。它肯定还有一些 hacky 部分,但至少它非常简单,因此调试/修改/添加它应该不会太难。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-23
      • 1970-01-01
      • 2018-04-16
      • 2019-05-14
      • 2019-01-09
      相关资源
      最近更新 更多