代码
for ( var i:int = 0; i < markers.length; i++ )
{
markers[i].addEventListener( MapMouseEvent.CLICK, function( e:Event ):void
{
markers[i].openInfoWindow( infoWindows[i] );
});
map.addOverlay( markers[i] );
}
我有markers
数组中的标记列表,以及infoWindow
数组中关联的InfoWindowOptions列表。
问题
单击标记并调用匿名函数时,for循环已经完成,i
现在等于markers.length
。所以我在markers[i]
和infoWindows[i]
上遇到了一个越界错误。
我想创建一个关联函数列表并将其存储在一个数组中。所以我可以做这样的事情:
for ( var i:int = 0; i < markers.length; i++ )
{
markers[i].addEventListener( MapMouseEvent.CLICK, markerListeners[i] );
}
所以我需要知道的是,
答案 0 :(得分:2)
有更好的方法吗?
我将尝试更好的方法来做到这一点。首先,最好避免每个人在addEventListener中放置一个匿名函数,因为你将无法删除那些监听器而且它不会被垃圾收集 - 所以你的应用程序会有内存泄漏。
话虽如此,Dictionary
对于这个目的来说是完美的。
而不是维护两个单独的数组并尝试将它们链接在一起,词典的关键:值语法将大大简化您的工作流程。
首先你应该设置你的词典:
var markersDictionary:Dictionary = new Dictionary(true);
//you didn't show how you create your arrays so I'm showing
//you how to create a dictionary manually.
//this can also be done in a loop
markersDictionary[marker] = new InfoWindow(); // This should be whatever is in your infoWindows array
markersDictionary[marker] = new InfoWindow();
markersDictionary[marker] = new InfoWindow();
现在添加监听器:
for(var key:Object in markersDictionary)
{
var marker:Marker = markersDictionary[key];
marker.addEventListener(MouseMapEvent.CLICK, markerClickhandler, false, 0, true);
//...false, 0, true is for weak event listeners, you should get in
// the habit of always doing this unless you have a reason to otherwise.
{
当然您需要定义markerClickhandler
:
function markerClickhandler(event:MouseMapEvent):void
{
var marker:Marker = event.target as Marker;
marker.openInfoWindow(InfowWindow(markersDictionary[marker]);
}
答案 1 :(得分:0)
有更好的方法吗?
好问题。标记应该是MapMouseEvent的目标,因此您可以使用常规函数并按目标区分标记。
答案 2 :(得分:0)
为了避免边界错误,您需要获取i
的值而不是引用,该引用将保存在您的匿名处理函数中。我确信有一种更优雅的方式来实现这一点,而不是以下,但这就是我要做的诀窍:
for ( var i:int = 0; i < markers.length; i++ )
{
markers[i].addEventListener( MapMouseEvent.CLICK, createMapMouseEventHandler(i));
map.addOverlay( markers[i] );
}
...
}
private function createMapMouseEventHandler(index:int):Function
{
return function( e:Event ):void
{
markers[index].openInfoWindow( infoWindows[index] );
}
}
注意:如果markers
和/或infoWindows
超出了createMapMouseEventHandler的范围,则需要将它们作为参数传递。