我正在尝试使用angular-google-maps模块ui-gmap-windows
在Google地图上的InfoWindow中创建一个链接。
在我的HTML模板中,我有:
<ui-gmap-google-map center='main.map.center' zoom='main.map.zoom' options='main.map.options'>
<ui-gmap-markers models="main.markers" coords="'self'" icon="'icon'" options="'options'" click="'onClick'" fit="true">
<ui-gmap-windows show="'showWindow'" closeClick="'closeClick'" ng-cloak>
<div class="mapinfowindow" data-ui-sref="display({id: id})">
<span class="itemname" data-ng-non-bindable>{{ title }}</span>
</div>
</ui-gmap-windows>
</ui-gmap-markers>
</ui-gmap-google-map>
在我的控制器中,我有:
uiGmapGoogleMapApi.then(function(maps) {
vm.itemlist = search.getItemList();
var markers = [];
_.each(vm.itemlist,function(item){
search.getGeometry(item.href).then(function(marker) {
marker.title = item.en;
marker.id = item.href;
marker.showWindow = false;
marker.options = {
title: item.en,
icon: markericon.normal
};
marker.onClick = function() { vm.markerClick(marker); };
marker.closeClick = function() { vm.markerCloseClick(marker); };
markers.push(marker);
});
});
vm.markers = markers;
});
注意我正在使用&#39;控制器作为&#39;语法,因此控制器中的vm.markers
在html模板中显示为main.markers
。
我看到的问题是,html中的data-ui-sref="display({id: id})"
会将状态更改为&#39;显示&#39;页面,但是没有将id
作为$ stateParams值推送,这显然不是很好,因为我不知道要显示什么..
我有另一个指向同一页面的链接,在InfoWindow外部创建(在结果列表中),执行推送id值:
<div data-ng-repeat="entry in main.itemlist">
<div data-ui-sref="display({id: entry.id})">
非常感谢任何有关使InfoWindow链接正常工作的帮助。
答案 0 :(得分:12)
以下是我根据https://github.com/angular-ui/angular-google-maps/issues/884中的信息
解决此问题的方法我为InfoWindow创建了一个模板和单独的控制器,并将我的HTML更改为:
<ui-gmap-google-map center='main.map.center' zoom='main.map.zoom' options='main.map.options'>
<ui-gmap-markers models="main.markers" coords="'self'" icon="'icon'" options="'options'" click="'onClick'" fit="true">
<ui-gmap-windows show="'showWindow'" closeClick="'closeClick'" templateUrl="'templateUrl'" templateParameter="'templateParameter'" ng-cloak>
</ui-gmap-windows>
</ui-gmap-markers>
</ui-gmap-google-map>
如您所见,现在有两个新参数:templateUrl
和templateParameter
。
在主控制器中,我输入了模板所需的信息:
...
marker.templateUrl = templateUrl;
marker.templateParameter = {
id: item.id,
title: item.name,
href: item.href,
img: vm.lookup_extphoto[item.href] //getting a photo externally
};
...
在InfoWindow的模板中,我有:
<div data-ng-controller="infowindowTemplateController">
<div class="mapinfowindow" data-ui-sref="display({id: parameter.id})">
<div class="previewimage-container">
<img data-ng-attr-src="{{:: parameter.img }}">
</div>
<span>{{:: parameter.title }}</span>
</div>
</div>
infowindowTemplateController本身几乎是空的:
(function(){
'use strict';
angular
.module('myapp')
.controller('infowindowTemplateController', infowindowTemplateController);
infowindowTemplateController.$inject=['$scope'];
function infowindowTemplateController ($scope) {
}
})();
答案 1 :(得分:2)
如果在id
范围内明确提供.mapinfowindow
,您可以尝试:
<div class="mapinfowindow" data-ui-sref="display({id: '{{id}}'})">
(资料来源:https://github.com/angular-ui/ui-router/issues/395#issuecomment-59136525)
如果这不起作用,您可能需要一个自定义指令。
答案 2 :(得分:2)
使用$parent
获取值。
<强>模板:强>
<ui-gmap-marker ng-repeat="marker in markers"
coords="marker.coords">
<ui-gmap-window ng-cloak>
<a ui-sref="details({ id : $parent.marker.id })">Go!</a>
</ui-gmap-window>
</ui-gmap-marker>
<强>控制器:强>
for (var i = 0; i < mArray.length; i++) {
var marker = {
id : mArray[i]._id,
coords : {
latitude : mArray[i].address.latitude,
longitude : mArray[i].address.longitude
}
};
$scope.markers.push(marker);
}