2011-01-21 71 views
0

代码存储的功能

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的列表的列表。

的问题

通过单击该标记的时间和匿名函数调用,用于循环已完成和i现在等于markers.length。所以我在markers[i]infoWindows[i]上遇到了一个界限错误。

我想创建一个关联函数的列表,并将其存储在一个数组中。所以,我可以做这样的事情,而不是:

for (var i:int = 0; i < markers.length; i++) 
{ 
    markers[i].addEventListener(MapMouseEvent.CLICK, markerListeners[i]); 
} 

所以我需要知道的是两种,

  • 我如何能的函数引用列表存储在一个阵列?
  • 有没有更好的方法来做到这一点?

回答

2

有没有更好的方法来做到这一点?

我会尝试更好的方式来做到这一点。首先,最好避免每一个在addEventListener中放置一个匿名函数,因为你无法移除这个监听器,也不会被垃圾收集 - 所以你的应用程序会有内存泄漏。

即便如此,Dictionary将是完美的。

不是维护两个单独的数组,而是试图将它们连接在一起,Dictionary的key:value语法将极大地简化您的工作流程。

首先,你应该设置你的字典:

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]); 
} 
+0

+1详细解释。通过在addEventListener中使用弱引用参数可能会破坏内存泄漏,但匿名处理程序方法无论如何都是不好的。如果可以在点击标记后完成,我也不会一次创建所有InfoWindows(这是问题作者的注释)。 – alxx 2011-01-23 13:48:33

0

有没有更好的方法来做到这一点?

好问题。标记应该是MapMouseEvent的目标,因此您可以使用常规函数并按目标区分标记。

0

为避免出现边界错误,您需要获取的值而不是引用,该引用保存在您的匿名处理函数中。我敢肯定有来实现这一目标比下面更优雅的方式,但是这是我必须做的伎俩:

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的范围之内您需要将它们作为参数传递。