我正在使用谷歌地图 api 来显示一些信息窗口(谷歌地图气球窗口)。
var contentString = '<div id="content"><p>hello world</p></div>';
var infowindow = new google.maps.InfoWindow({
content: contentString
});
//... add info window to google map object
当您单击地图标记时,这将在气球中显示“Hello world”。(地图标记是地图上的一个图标,就像您习惯的红色大头针一样。
我希望 infoWindow 的内容是动态的,所以我将contentString设置为:
"<div id='infoWindowContent' ngInclude='/Content/Static/MapPersonDetails.html'></div>";
当用户单击地图标记时,它会插入到页面的 DOM 中。为了完成这项工作,我必须编译上面的行,当它被插入到页面的 DOM 中时。
我正在使用一个抽象地图使用的指令,例如:
<div class="google-map"
markers="markersProperty"
on-Info-Window-Dom-Ready="onInfoWindowDomReady()">
</div>
因此,当单击地图标记时,该指令将创建 infoWindow,订阅inforWindow的 domReadyEvent,显示 infoWindow,并将domReadyEvent 冒泡到页面控制器。
infoWindow 公开了一个我通过指令冒泡的domReady事件,我在我的页面控制器中执行以下操作:
$scope.onInfoWindowDomReady = function () {
$scope.$apply(function () {
var element = document.getElementById("infoWindowContent");
$compile(element)($scope);
});
};
我遇到的问题是我不喜欢我在控制器中进行的 dom 操作。有没有其他方法可以做到这一点?我应该将编译放在指令中吗?然后该指令将知道 infoWindow 内容是动态的并且必须进行编译,但并非所有信息窗口都如此。
要知道的重要一点是 infoWindow 内容也可以是 html 元素(与静态字符串相反),但我不知道这是否有任何帮助。