Хранение списка функций - PullRequest
0 голосов
/ 21 января 2011

код

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 и список связанных InfoWindowOptions в массиве infoWindow.

Выпуск

К моменту щелчка маркера и вызова анонимной функции цикл for уже завершен, и i теперь равно markers.length. Таким образом, я получаю ошибку выхода за границы markers[i] и infoWindows[i].

Я хотел бы также создать список связанных функций и сохранить его в массиве. Поэтому я могу сделать что-то вроде этого:

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

Так что мне нужно знать, либо,

  • Как я могу сохранить список ссылок на функции в массиве?
  • Есть ли лучший способ сделать это?

Ответы [ 3 ]

2 голосов
/ 22 января 2011

Есть ли лучший способ сделать это?

Я собираюсь попробовать лучший способ сделать это. Во-первых, хорошо избегать каждого добавления анонимной функции в 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]);
}
0 голосов
/ 22 января 2011

Чтобы избежать ошибки границ, вам нужно получить значение для 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, вам нужно будет передать их в качестве параметров.

0 голосов
/ 22 января 2011

Есть ли лучший способ сделать это?

Хороший вопрос.Маркер должен быть целью MapMouseEvent, поэтому вы можете использовать обычную функцию и различать маркеры по цели.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...