我想包括一个模板文件views/infowindow.html
从服务信息窗口我的内容我写来启动谷歌地图API:
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
时,它被插入到信息窗口(检查经由开发工具的代码时,即得到插入的代码被<div ng-include src="'views/infowindow.html'"></div>
我希望角将预先处理我包括它插入信息窗口前,但很可惜没有。
正是我试图做可能吗?
我在想,我得把它传递给前以某种方式缓存模板infowindow.setContent()
但我不知道该怎么做(或者如果这是连我自己应该做的事情)。 我宁愿要加载的事件,而不是高速缓存和它注入每个标记的模板。
编辑在$ templateCache展望和相关的SO问题 。
编辑2这里的一个普拉克任何试图使用$compile
(信息窗口的内容仍然是<div id="infowindow_content" ng-include src="'infowindow.html'"></div>
解
这样做的依据来自以下马克的回答 。 在他的解决方案,对信息窗口内容编译首先点击(内的任何标记),但信息窗口实际上并没有打开,直到上的任何标记再点击一下,可能是因为谷歌地图是不耐烦。
移动$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
更新Plunker 。