【发布时间】:2012-12-23 00:19:40
【问题描述】:
我正在尝试将模板文件 views/infowindow.html 作为我为启动 google maps api 而编写的服务中的 InfoWindow 的内容:
for ( var count = locations.length, i = 0; i < count; i++ ) {
var latLng = locations[i],
marker = new google.maps.Marker({
…
}),
infowindow = new google.maps.InfoWindow();
google.maps.event.addListener(
marker,
'click',
(function( marker , latLng ){
return function(){
var content = '<div ng-include src="\'infowindow.html\'"></div>';
infowindow.setContent( content );
infowindow.open( Map , marker );
}//return fn()
})( marker , latLng )
);//addListener
}//for
但是,当将content 插入信息窗口时,Angular 似乎没有处理它(通过开发工具检查代码时,插入的代码是<div ng-include src="'views/infowindow.html'"></div>)。
我希望 Angular 在将我的包含插入到 InfoWindow 之前对其进行预处理,但可惜没有。
我正在尝试做的事情可能吗?
我想在将模板传递给 infowindow.setContent() 之前,我必须以某种方式缓存模板,但我不知道该怎么做(或者我什至应该这样做正在做)。我宁愿在事件上加载模板,而不是为每个标记缓存和注入它。
编辑查看 $templateCache 和 related SO question。
EDIT 2这是一个尝试使用$compile的plunk(InfoWindow的内容仍然是<div id="infowindow_content" ng-include src="'infowindow.html'"></div>)
解决方案
这个基础来自Mark's answer below。在他的解决方案中,InfoWindow 的内容在第一次单击(任何标记)时编译,但 InfoWindow 直到再次单击任何标记时才真正打开,可能是因为 GoogleMaps 不耐烦。
将$compile移到外面,然后将编译后的模板传入.addListener就可以解决这个问题:
for ( … ) {
…
infowindow = new google.maps.InfoWindow();
scope.markers …
var content = '<div id="infowindow_content" ng-include src="\'infowindow.html\'"></div>';
var compiled = $compile(content)(scope);
google.maps.event.addListener(
marker,
'click',
(function( marker , scope, compiled , localLatLng ){
return function(){
scope.latLng = localLatLng;//to make data available to template
scope.$apply();//must be inside write new values for each marker
infowindow.setContent( compiled[0].innerHTML );
infowindow.open( Map , marker );
};//return fn()
})( marker , scope, compiled , scope.markers[i].locations )
);//addListener
}//for
【问题讨论】:
-
您好。我想知道为什么打开另一个信息窗口时您的信息窗口会关闭?我必须使用相同的信息窗口来实现这一点。似乎每个人都有一个,但它们仍然关闭。
-
@Hawk,我不明白你的问题。我不再使用 InfoWindow(我使用 InfoBox),所以我可能无法为您提供帮助。
-
@jacob 你可能应该使用
infowindow.setContent( compiled[0]);而不是infowindow.setContent( compiled[0].innerHTML ); -
@theres,是的,这可能更好。
-
有没有办法在 infowindow.open() 之后保留双向绑定?我想让模板对范围内的更改做出反应。例如,我在您的示例中添加了一个 setInteral 调用来修改范围,但此更改不会自动反映在打开的 infoWindow 上。见:plnkr.co/edit/Ix92XXSqxru8eMtmCdgH?p=preview
标签: javascript google-maps-api-3 include angularjs infowindow