Google 地图 - 显示信息窗口 (angularjs)
GoogleMaps - make infoWindows appear (angularjs)
我想知道你是否可以帮助我。通过 angular js v1,我在我的网页中嵌入了一张地图,其中:
- 允许用户输入出发地和目的地。
- 绘制标记并显示从起点到终点的路线。
- 显示 waypoints 的始发地、目的地和中间航路点的餐厅(作为标记)。 (所以3分,我是不是用多了google api requests/limits.
问题:
当我点击我的标记时,我的信息窗口没有出现。
默认情况下,它似乎自然会出现在起点和终点,但我无法弄清楚如何让它们出现在所有作为标记出现的餐厅中。 (为此使用了 PlaceSearch)。
我已经 googled 了很多,但由于我是 JS/Angular 的新手,我想不出最好的方法。
下面是我的指令代码,其中包含一些 infoWindow 代码,但如您所见,我被难住了。不确定我是否需要点击处理程序?
googleMap.$inject = [];
function googleMap() {
return {
restrict: 'E',
template: '<div class="google-map"></div>',
replace: true,
scope: {
center: '=',
zoom: '=',
origin: '=',
destination: '=',
travelMode: '='
},
link($scope, $element) {
const map = new google.maps.Map($element[0], {
zoom: $scope.zoom,
center: $scope.center
});
const directionsService = new google.maps.DirectionsService();
const directionsDisplay = new google.maps.DirectionsRenderer();
const placesService = new google.maps.places.PlacesService(map);
// const infoWindows = [];
// const infowindow = new google.maps.InfoWindow();
// let marker = new google.maps.Marker;
directionsDisplay.setMap(map);
$scope.$watch('center', () => map.setCenter($scope.center), true);
$scope.$watchGroup(['origin', 'destination', 'travelMode'],
displayRoute);
// DISPLAY ROUTE
function displayRoute() {
if(!$scope.origin || !$scope.destination || !$scope.travelMode)
return false;
directionsService.route({
origin: $scope.origin,
destination: $scope.destination,
travelMode: $scope.travelMode
}, (response) => {
directionsDisplay.setDirections(response);
// beginning of this form
// response.routes[0].legs[0].steps.map(step => {
const steps = response.routes[0].legs[0].steps
const lookup = [steps[0], steps[Math.round(steps.length / 2)],
steps[steps.length - 1]]
lookup.map(step => {
placesService.nearbySearch({
location: step.start_point,
radius: 50,
type: ['restaurant'],
openNow: true
}, (results) => {
results.map(place => {
console.log(place.name);
return new google.maps.Marker({
map: map,
position: place.geometry.location,
// label: '⭐️',
title: place.name
}); //google maps marker
});
results.map(place => {
console.log(place.vicinity);
const contentString = place.name;
return new google.maps.InfoWindow({
title: place.name,
content: contentString
}); //google maps marker
// infoWindows.push(infowindow);
});
});
}); //end of this function
}); //end return directionsdisplay
} //display route ends
} //link scope ends
};
}
export default googleMap;
谢谢!
一种方法是创建信息窗口和标记 - 然后将点击事件绑定到 open/close 信息窗口 -
var marker = new google.maps.Marker({
position: latlng,
map: mapObject,
title: "MARKER"
});
var infoWindow = new google.maps.InfoWindow({
content: "<h1>Hello World</h1>"
});
google.maps.event.addListener(marker, "click", function () {
infoWindow.open(mapObject, marker);
});
编辑 - 在你的情况下你正在绘制一个 Array/List 标记并且每个标记都有它自己的信息 Window - 所以你可以将标记(结果)代码的绘制更改为这样的东西:
注意:未使用编译器,可能包含语法错误
// keep reference of plotted markers, so we can clear them if required
var markers = [];
for (var i = 0; i < results.length; i++) {
var place = results[i];
// create marker
var marker = new google.maps.Marker({
map: mapObject,
position: place.geometry.location,
title: place.name
});
// create info window
var infoWindow = new google.maps.InfoWindow({
content: ''
});
//adding an extra property to marker, (infoWindow - so we can get it inside click event of marker
marker.infoWindow = infoWindow;
// click event handler
google.maps.event.addListener(marker, "click", function() {
// this == marker
var map = this.infoWindow.getMap();
if (map !== null && typeof map !== "undefined")
this.infoWindow.close();
else {
// open info window at marker position
this.infoWindow.open(mapObject, this);
}
});
markers.push(marker);
}
我想知道你是否可以帮助我。通过 angular js v1,我在我的网页中嵌入了一张地图,其中:
- 允许用户输入出发地和目的地。
- 绘制标记并显示从起点到终点的路线。
- 显示 waypoints 的始发地、目的地和中间航路点的餐厅(作为标记)。 (所以3分,我是不是用多了google api requests/limits.
问题: 当我点击我的标记时,我的信息窗口没有出现。 默认情况下,它似乎自然会出现在起点和终点,但我无法弄清楚如何让它们出现在所有作为标记出现的餐厅中。 (为此使用了 PlaceSearch)。
我已经 googled 了很多,但由于我是 JS/Angular 的新手,我想不出最好的方法。
下面是我的指令代码,其中包含一些 infoWindow 代码,但如您所见,我被难住了。不确定我是否需要点击处理程序?
googleMap.$inject = [];
function googleMap() {
return {
restrict: 'E',
template: '<div class="google-map"></div>',
replace: true,
scope: {
center: '=',
zoom: '=',
origin: '=',
destination: '=',
travelMode: '='
},
link($scope, $element) {
const map = new google.maps.Map($element[0], {
zoom: $scope.zoom,
center: $scope.center
});
const directionsService = new google.maps.DirectionsService();
const directionsDisplay = new google.maps.DirectionsRenderer();
const placesService = new google.maps.places.PlacesService(map);
// const infoWindows = [];
// const infowindow = new google.maps.InfoWindow();
// let marker = new google.maps.Marker;
directionsDisplay.setMap(map);
$scope.$watch('center', () => map.setCenter($scope.center), true);
$scope.$watchGroup(['origin', 'destination', 'travelMode'],
displayRoute);
// DISPLAY ROUTE
function displayRoute() {
if(!$scope.origin || !$scope.destination || !$scope.travelMode)
return false;
directionsService.route({
origin: $scope.origin,
destination: $scope.destination,
travelMode: $scope.travelMode
}, (response) => {
directionsDisplay.setDirections(response);
// beginning of this form
// response.routes[0].legs[0].steps.map(step => {
const steps = response.routes[0].legs[0].steps
const lookup = [steps[0], steps[Math.round(steps.length / 2)],
steps[steps.length - 1]]
lookup.map(step => {
placesService.nearbySearch({
location: step.start_point,
radius: 50,
type: ['restaurant'],
openNow: true
}, (results) => {
results.map(place => {
console.log(place.name);
return new google.maps.Marker({
map: map,
position: place.geometry.location,
// label: '⭐️',
title: place.name
}); //google maps marker
});
results.map(place => {
console.log(place.vicinity);
const contentString = place.name;
return new google.maps.InfoWindow({
title: place.name,
content: contentString
}); //google maps marker
// infoWindows.push(infowindow);
});
});
}); //end of this function
}); //end return directionsdisplay
} //display route ends
} //link scope ends
};
}
export default googleMap;
谢谢!
一种方法是创建信息窗口和标记 - 然后将点击事件绑定到 open/close 信息窗口 -
var marker = new google.maps.Marker({
position: latlng,
map: mapObject,
title: "MARKER"
});
var infoWindow = new google.maps.InfoWindow({
content: "<h1>Hello World</h1>"
});
google.maps.event.addListener(marker, "click", function () {
infoWindow.open(mapObject, marker);
});
编辑 - 在你的情况下你正在绘制一个 Array/List 标记并且每个标记都有它自己的信息 Window - 所以你可以将标记(结果)代码的绘制更改为这样的东西:
注意:未使用编译器,可能包含语法错误
// keep reference of plotted markers, so we can clear them if required
var markers = [];
for (var i = 0; i < results.length; i++) {
var place = results[i];
// create marker
var marker = new google.maps.Marker({
map: mapObject,
position: place.geometry.location,
title: place.name
});
// create info window
var infoWindow = new google.maps.InfoWindow({
content: ''
});
//adding an extra property to marker, (infoWindow - so we can get it inside click event of marker
marker.infoWindow = infoWindow;
// click event handler
google.maps.event.addListener(marker, "click", function() {
// this == marker
var map = this.infoWindow.getMap();
if (map !== null && typeof map !== "undefined")
this.infoWindow.close();
else {
// open info window at marker position
this.infoWindow.open(mapObject, this);
}
});
markers.push(marker);
}