Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如果没有mapDataProvider,Google map Ag对象将返回什么?_Javascript_Angularjs_Google Maps_Ionic Framework - Fatal编程技术网

Javascript 如果没有mapDataProvider,Google map Ag对象将返回什么?

Javascript 如果没有mapDataProvider,Google map Ag对象将返回什么?,javascript,angularjs,google-maps,ionic-framework,Javascript,Angularjs,Google Maps,Ionic Framework,我正在做一个SPA项目(ionic,所以它与ui路由器有一定的关系),我需要在两个不同的页面/控制器上显示两个不同的地图 第一个地图是一个普通地图(我们称之为主地图),其中标记了几个位置,第二个地图(我们称之为编辑地图)是一个特定位置的焦点,用户可以通过拖动标记编辑位置 我使用的一般实现方案是从mappingService调用一个initMap方法,该方法从每个控制器实例化一个GoogleMap $rootScope.markers=[] this.initMap = function init

我正在做一个SPA项目(ionic,所以它与ui路由器有一定的关系),我需要在两个不同的页面/控制器上显示两个不同的地图

第一个地图是一个普通地图(我们称之为主地图),其中标记了几个位置,第二个地图(我们称之为编辑地图)是一个特定位置的焦点,用户可以通过拖动标记编辑位置

我使用的一般实现方案是从mappingService调用一个initMap方法,该方法从每个控制器实例化一个GoogleMap

$rootScope.markers=[]

this.initMap = function initMap(mapTarget, mapCenter) {
  // the initMap function initialize the map it takes two arguments:
  //  + mapTaget which defines the html element the map is bound to.
  //  + mapCenter that defines the center of the map and whether to display the center

  var markup = "<div id='" + mapTarget.mapId + "'></div>";
  document.getElementById(mapTarget.containerId).innerHTML = markup;

  var centerPos = new google.maps.LatLng(mapCenter.lat, mapCenter.lng);

  $rootScope.map = new google.maps.Map(document.getElementById(mapTarget.mapId), {
    center: centerPos,
    zoom: 18,
    disableDefaultUI: true
  });

  // eventually place a person marker for the user's position
  if (mapCenter.display) {
    console.log('placing the position marker');
    $rootScope.markers[0] = new google.maps.Marker({
      position: {lat: mapCenter.lat, lng: mapCenter.lng},
      map: $rootScope.map,
      title: 'userLocation',
      icon: './img/person_icon.png'
    });
  }
};
在编辑地图时,我直接调用地图服务

mappingService.initMap(
  {containerId: $scope.mapContainer, mapId: $scope.mapId},
  {lat: $scope.location.lat, lng: $scope.location.lng, display: false}
);
我能够毫无问题地渲染这两个贴图,甚至可以添加标记和一些事件侦听器

然而,我遇到了一个问题,在一些操作序列之后,例如从主地图到编辑地图两次,其中一个地图会突然变为空白(确切地说是白色的,所以这似乎不是我可以通过调整地图大小来解决的问题)。我正在接收Ag对象,唯一的区别是我没有在损坏的映射上获取mapDataProviders属性

当它工作时,我得到:

如果没有,我会得到:

上面的代码片段是我最后一次实现尝试。我一直在尝试用很多不同的方法来实现这些地图,但都没有用。在这些尝试中,我尝试了:

  • 完全分离这两个实例,将initMap方法分为initMainMap和initEditMap
  • 对两个映射使用一个实例并替换DOM元素>,这是您在上面看到的,在离开视图时调用以下附加方法:

    this.removeMap=函数removeMap(containerId){ var container=document.getElementById(containerId); $rootScope.markers=[]; container.innerHTML=''; //重要部分: var old_元素=容器; var new_element=old_element.cloneNode(true); 旧的\u元素.parentNode.replaceChild(新的\u元素,旧的\u元素)

    删除$rootScope.map; }

    知道在这两种观点中,我都有:


我试图理解是什么让google map API返回一个没有mapDataProvider的地图(我相信这意味着地图可以工作,甚至开始渲染,只是它没有要显示的分幅)

另外,看起来有内存泄漏,这显然是一个众所周知的问题


如果有人知道这个问题的答案,我就有点迷路了

事实上,我想知道的第一件事是,这是否可能是内存泄漏的结果。看起来我有一个,虽然很小,但可能完全不相关。
mappingService.initMap(
  {containerId: $scope.mapContainer, mapId: $scope.mapId},
  {lat: $scope.location.lat, lng: $scope.location.lng, display: false}
);
<div id="edit-map-container"></div>