views/infowindow.html
Google マップ 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
InfoWindow に挿入すると Angular が処理していないようです (Dev Tools でコードを調べると、挿入されるコードは です<div ng-include src="'views/infowindow.html'"></div>
)。
InfoWindow に挿入される前に Angular がインクルードを前処理することを望んでいましたが、残念ながら違います。
私がやろうとしていることは可能ですか?
テンプレートを に渡す前に、どうにかしてテンプレートをキャッシュする必要があると考えていますが、infowindow.setContent()
その方法がわかりません (または、それが私がすべきことでさえあるかどうか)。マーカーごとにテンプレートをキャッシュして注入するのではなく、イベントにテンプレートをロードすることをお勧めします。
編集$templateCache と関連する SO questionを見てください。
EDIT 2これは、使用しようとするプランクです( InfoWindowの$compile
コンテンツはまだです<div id="infowindow_content" ng-include src="'infowindow.html'"></div>
)
解決
この根拠は、以下のマークの回答から来ました。彼のソリューションでは、InfoWindow のコンテンツは (任意のマーカーの) 最初のクリックでコンパイルされますが、おそらく GoogleMaps がせっかちなため、InfoWindow はマーカーをもう一度クリックするまで実際には開きません。
$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