Google 模态地图在两次打开后不显示 - Ionic
Google Maps in modal not showed after two times open - Ionic
我在模式视图中创建了一个 Google 地图,一旦我打开该模式,就会显示该地图。然后,我单击导航后退按钮转到主页。之后我尝试打开模式再次查看地图,但地图没有显示。
此处演示:http://codepen.io/aishahismail/pen/vLZprV
HTML:
<script id="modal.html" type="text/ng-template">
<div class="modal">
<header class="bar bar-header bar-positive">
<h1 class="title">I'm A Modal</h1>
<div class="button button-clear" ng-click="modal.hide()"><span class="icon ion-close"></span></div>
</header>
<content has-header="true" padding="true">
<p>This is a map</p>
<div id="map" data-tap-disabled="true"></div>
</content>
</div>
</script>
Javascript:控制器
.controller('HomeTabCtrl', function($scope, $ionicModal, $ionicLoading, $compile) {
console.log('HomeTabCtrl');
$ionicModal.fromTemplateUrl('modal.html', function($ionicModal) {
$scope.modal = $ionicModal;
}, {
scope: $scope,
animation: 'slide-in-up'
});
$scope.showMap = 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()'>Click me!</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;
}
$scope.openModal = function(){
$scope.modal.show();
$scope.showMap();
}
});
我在 stack overflow Google maps in modal only displays first map 中发现了同样的问题,但仍然没有得到答案。我在 1 天内一直在寻找它,但我仍然无法解决这个问题。我希望有人能帮助我。
将代码移至 mainCtrl 而不是 HomeTabCtrl 可解决问题:
检查这个CodePen
HTML:
<body ng-controller="mainCtrl">
...
JS:
.controller('mainCtrl', function($scope, $ionicModal, $compile) {
// the code previously in HomeTabCtrl
}
我注意到您使用的是旧版本的 Ionic 和 old-style 指令。
这是使用 Angular-google-maps:
更新的 Ionic 应用程序版本
经过将近 1 周的尝试寻找解决方案,我终于找到了答案。
问题中的所有代码都相同,但我只是将其添加到我的 控制器 中。看看
//Remove modal
$scope.$on('$destroy', function () {
$scope.modal.remove();
});
//Set $scope.map to null
$scope.$on('modal.hidden', function () {
$scope.$on('$destroy', function () {
$scope.map = null;
});
});
我也在修改地图模块代码,我用的是$cordovaGeolocation。下面是 homeTabCtrl
的完整代码
Javascript: homeTabCtrl
.controller('HomeTabCtrl', function($scope, $ionicModal, $cordovaGeolocation) {
$ionicModal.fromTemplateUrl('modal.html', function($ionicModal) {
$scope.modal = $ionicModal;
}, {
scope: $scope,
animation: 'slide-in-up'
});
$scope.showMap = function (){
var options = {
timeout: 10000,
enableHighAccuracy: true
};
$cordovaGeolocation.getCurrentPosition(options).then(function (position) {
var latLng = new google.maps.LatLng(lat, lng);
var mapOptions = {
center: latLng,
zoom: 15,
mapTypeId: google.maps.MapTypeId.ROADMAP
};
$scope.map = new google.maps.Map(document.getElementById("map"), mapOptions);
google.maps.event.addListenerOnce($scope.map, 'idle', function () {
var marker = new google.maps.Marker({
map: $scope.map,
animation: google.maps.Animation.DROP,
position: latLng
});
});
}, function (error) {
alert("Could not get location");
});
};
$scope.openModal = function(){
$scope.modal.show();
$scope.showMap();
};
//Remove modal
$scope.$on('$destroy', function () {
$scope.modal.remove();
});
//Set $scope.map to null
$scope.$on('modal.hidden', function () {
$scope.$on('$destroy', function () {
$scope.map = null;
});
});
});
我在模式视图中创建了一个 Google 地图,一旦我打开该模式,就会显示该地图。然后,我单击导航后退按钮转到主页。之后我尝试打开模式再次查看地图,但地图没有显示。
此处演示:http://codepen.io/aishahismail/pen/vLZprV
HTML:
<script id="modal.html" type="text/ng-template">
<div class="modal">
<header class="bar bar-header bar-positive">
<h1 class="title">I'm A Modal</h1>
<div class="button button-clear" ng-click="modal.hide()"><span class="icon ion-close"></span></div>
</header>
<content has-header="true" padding="true">
<p>This is a map</p>
<div id="map" data-tap-disabled="true"></div>
</content>
</div>
</script>
Javascript:控制器
.controller('HomeTabCtrl', function($scope, $ionicModal, $ionicLoading, $compile) {
console.log('HomeTabCtrl');
$ionicModal.fromTemplateUrl('modal.html', function($ionicModal) {
$scope.modal = $ionicModal;
}, {
scope: $scope,
animation: 'slide-in-up'
});
$scope.showMap = 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()'>Click me!</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;
}
$scope.openModal = function(){
$scope.modal.show();
$scope.showMap();
}
});
我在 stack overflow Google maps in modal only displays first map 中发现了同样的问题,但仍然没有得到答案。我在 1 天内一直在寻找它,但我仍然无法解决这个问题。我希望有人能帮助我。
将代码移至 mainCtrl 而不是 HomeTabCtrl 可解决问题:
检查这个CodePen
HTML:
<body ng-controller="mainCtrl">
...
JS:
.controller('mainCtrl', function($scope, $ionicModal, $compile) {
// the code previously in HomeTabCtrl
}
我注意到您使用的是旧版本的 Ionic 和 old-style 指令。 这是使用 Angular-google-maps:
更新的 Ionic 应用程序版本经过将近 1 周的尝试寻找解决方案,我终于找到了答案。
问题中的所有代码都相同,但我只是将其添加到我的 控制器 中。看看
//Remove modal
$scope.$on('$destroy', function () {
$scope.modal.remove();
});
//Set $scope.map to null
$scope.$on('modal.hidden', function () {
$scope.$on('$destroy', function () {
$scope.map = null;
});
});
我也在修改地图模块代码,我用的是$cordovaGeolocation。下面是 homeTabCtrl
的完整代码Javascript: homeTabCtrl
.controller('HomeTabCtrl', function($scope, $ionicModal, $cordovaGeolocation) {
$ionicModal.fromTemplateUrl('modal.html', function($ionicModal) {
$scope.modal = $ionicModal;
}, {
scope: $scope,
animation: 'slide-in-up'
});
$scope.showMap = function (){
var options = {
timeout: 10000,
enableHighAccuracy: true
};
$cordovaGeolocation.getCurrentPosition(options).then(function (position) {
var latLng = new google.maps.LatLng(lat, lng);
var mapOptions = {
center: latLng,
zoom: 15,
mapTypeId: google.maps.MapTypeId.ROADMAP
};
$scope.map = new google.maps.Map(document.getElementById("map"), mapOptions);
google.maps.event.addListenerOnce($scope.map, 'idle', function () {
var marker = new google.maps.Marker({
map: $scope.map,
animation: google.maps.Animation.DROP,
position: latLng
});
});
}, function (error) {
alert("Could not get location");
});
};
$scope.openModal = function(){
$scope.modal.show();
$scope.showMap();
};
//Remove modal
$scope.$on('$destroy', function () {
$scope.modal.remove();
});
//Set $scope.map to null
$scope.$on('modal.hidden', function () {
$scope.$on('$destroy', function () {
$scope.map = null;
});
});
});