您可以有一个单独的模板来打印对象映射,并且正如您所猜测的那样,这必须使用AJAX
. 您将传递要在地图上显示的数据(不是 id,因为您不想再次查询数据库)并且控制器将返回格式化的 HTML。
然而,这在我看来有点矫枉过正。我总是会考虑做JS
(使用可选框架)以便将侧边栏的内容与Map
对象交换。
这实际上取决于您使用哪个地图 API。如果它可以通过控制,JS
我不会再看了。它不能,那么,AJAX
是你的自然选择....
更新:
好的,您应该做的是创建稍后将修改的初始 Map 对象:
var theMap = null;
function initializeMap(){
var mapOptions = {
center: new google.maps.LatLng(some_latitude, some_longitude),
zoom: 8, // goes from 0 to 18
mapTypeId: google.maps.MapTypeId.ROADMAP
};
theMap = new google.maps.Map(document.getElementById("map_canvas"),mapOptions);
// you must have some element with ID = 'map_canvas'
}
some_latitude
并且some_longitude
相当不重要,因为您很可能会在几分钟内设置新坐标。
现在假设(但根本不重要)您使用一些JS
框架(我更喜欢jQuery
),您可以将点击事件绑定到这些位置链接:
var onlyMarker = null;
$('.location').click(function(){
var $t = $(this);
var newLatLang = new google.maps.LatLng($t.attr('data-lat') ,$t.attr('data-lng'));
if ( onlyMarker == null ) {
onlyMarker = new google.maps.Marker({
position: newLatLang
map: theMap,
title: $t.attr('title')
});
}else{
onlyMarker.setPosition(newLatLang);
}
});
现在,依赖 HTML5 的 'data-*' 属性并不是一个好主意,特别是如果您使用任何其他更低的版本,您很可能会以无效标记告终。解决方法是让链接 ( <a>
) 携带 id/key 到LatLng
对象,例如:
// initially generated from `AJAX` or in `Twig` loop
var allLatlangs = [
new google.maps.LatLngf(some_latitude, some_longitude),
new google.maps.LatLngf(some_latitude, some_longitude),
new google.maps.LatLngf(some_latitude, some_longitude),
];
$('.location').click(function(){
var id = $(this).attr('id');
var newLatLang = allLatLang(id);
//....
// everything else is the same
// ....
});
不要忘记使用正确的 API 密钥包含 Maps API:
https://maps.googleapis.com/maps/api/js?key=API_KEY_HERE&sensor=true
为了获得有效的 API 密钥,请点击此链接:API KEY HOW-TO
该链接基本上涵盖了我在此处描述的关键步骤,因此请研究它,它应该很好地结合在一起。
此外,如果您不确定如何从地图中检索某些内容,您应该查阅参考资料:
REFERENCE,其中每个方法调用都描述得很好
请记住,在加载所有内容之前不要执行任何此代码。
希望这会有所帮助:)