addEventListener с рутером в AS3 - как? - PullRequest
0 голосов
/ 20 мая 2011

Я новая работа в Flash AS3, но у меня большая проблема с использованием некоторых концепций ООП, таких как возврат из методов, когда мне нужен код прослушивателя событий. Проблема в том, что функция из Event Listener не может вернуть значение. Как я могу работать с этой проблемой? Это пример кода, который я использую в своем приложении AIR. Этот код я хочу использовать повторно в других ситуациях, когда я хочу проанализировать файлы каталога.

private function initApp():void
{
    try
    {
        // Seta o diretoório de molduras
        var directory = diretorio_mestre.resolvePath("molduras/animacao");
        directory.getDirectoryListingAsync();
        directory.addEventListener(FileListEvent.DIRECTORY_LISTING, listaHandler);

    }
    catch (erro:ReferenceError)
    {
        mostraMensagem("Problemas com a listagem do diretório.", erro.errorID);

    }

    // Percorre arquivos
    function listaHandler(evento):void
    {
        // Contador
        var i:int = 0;

        // Conteúdo
        var contents = evento.files;

        for (i = 0; i < contents.length; i++) 
        {
            var nome:String = contents[i].name;
            var nome_array:Array = new Array();
            nome_array = nome.split("_");

            // Formata para ordenar
            arquivos_animacao.push ( { nome:contents[i].name, tamanho:contents[i].size, ordem:nome_array[0] } );

        }

        // Ordena para a ordem de númeração
        arquivos_animacao.sortOn("ordem", Array.NUMERIC);

        // Continua o processo
        // How can I return!?!?!

    }

}

Ответы [ 2 ]

2 голосов
/ 20 мая 2011

Если я правильно понимаю ваш вопрос, вы хотите передать дополнительные аргументы вместе с отправленным событием?Это распространенная проблема с flash / air, и это просто означает, что вам нужно создать собственное событие и расширить его дополнительными параметрами.

Я сделал не так давно пост с подробным описанием того, как это сделать прямо здесь: "Как реализовать пользовательские события" .

Основная идея заключается в том, что вы передаете аргументы вконец метода sig при отправке события и выборе их в виде массива на принимающей стороне.

Надеюсь, это поможет

1 голос
/ 21 мая 2011

Хорошо, во-первых, никогда не вкладывайте одну функцию в другую, это не ООП.

private function initApp():void{
  try{
    //Seta o diretoório de molduras
    var directory = diretorio_mestre.resolvePath("molduras/animacao");
    directory.getDirectoryListingAsync();
    directory.addEventListener(FileListEvent.DIRECTORY_LISTING, listaHandler);
  }catch(erro:ReferenceError){
    mostraMensagem("Problemas com a listagem do diretório.", erro.errorID);
  }
}


private function listaHandler(evento):void{
  var contents = evento.files;
  for (var i:int = 0; i < contents.length; i++) {
    var nome:String = contents[i].name;
    var nome_array:Array = new Array();
    nome_array = nome.split("_");
    arquivos_animacao.push ({nome:contents[i].name, tamanho:contents[i].size, ordem:nome_array[0]});
  }
  arquivos_animacao.sortOn("ordem", Array.NUMERIC);
  this.dispatchEvent( new Event("GOTRESULTS") );
}

Теперь, где бы вы ни создавали экземпляр класса, вы просто слушаете событие GOTRESULTS

var myClass:whatEverYouNamedIT = new whatEverYouNamedIT( );
myClass.addEventListener( "GOTRESULTS", gotResults )

function gotResults( e:Event ):void{
  trace(myClass.arquivos_animacao);
}
...