AS3: загружать внешние swf в цикле с прослушивателями событий с параметрами

Я пытаюсь сделать приложение, которое соединяет amfphp с анимацией as3. я получаю от amfphp массив, который я сортирую по некоторой переменной в выражении 'if'. после этого у меня есть 2 массива с массивами внутри друг друга:

var Array1:Array = [["http://url.to.swf", "http://url.to.link"], ["",""]...];
var Array2:Array = [["http://url.to.swf", "http://url.to.link"], ... ];

после этого я запускаю функцию, которая считывает эти массивы и загружает каждый swf на сцену:

ladujBajkiGorne(Array1);

function ladujBajkiGorne(polkaGorna:Array):void {
    for(var i=0; i<polkaGorna.length; i++) {
        Aktual = polkaGorna[i];
        var mLoader:Loader = new Loader();
        var mRequest:URLRequest = new URLRequest(String(Aktual[0]));
        mLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, myfunction = function(e:Event):void { onLoadGorna( e, String(Aktual[1]) ); } );
        mLoader.load(mRequest);
    }
}

потом

function onLoadGorna(e, arg1):void {
   userSwf = e.currentTarget.content;
   userSwf.buttonMode = true;
   userSwf.addEventListener(MouseEvent.CLICK, function(e:MouseEvent) { afterClick(e, arg1 ); });
   booksMC.addChild(userSwf);

   var childName:String = booksMC.getChildAt(childs).name;
   booksMC.getChildByName(childName).x = posX;
   booksMC.getChildByName(childName).y = 0;

   posX += 218;
   childs++;
}

и в конце

function afterClick(e, arg3) {
   var url:URLRequest = new URLRequest(arg3);
   navigateToURL(url, "_self");
}

проблема в том, что все загруженные swf имеют один и тот же URL в ссылке. он не меняется в функции ladujBajkiGorne в операторе addEventListener. Я пробую много вариантов, чтобы изменить это, и ничего не работает. Есть ли шанс помочь мне с этим? Спасибо заранее


person Kamil    schedule 16.01.2013    source источник


Ответы (2)


Проблема в асинхронном выполнении обработчика завершения загрузчика. Было бы очень хорошо передать соответствующий параметр загрузчику и прочитать его в обработчике. Я предлагаю простое решение, исправляя ваш код:

function ladujBajkiGorne(polkaGorna:Array):void {
    for(var i=0; i<polkaGorna.length; i++) {
        Aktual = polkaGorna[i];
        var mLoader:Loader = new Loader();
        var mRequest:URLRequest = new URLRequest(Aktual[0]+"?link="+Aktual[1]);
        mLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, myfunction = function(e:Event):void { onLoadGorna( e ); } );
        mLoader.load(mRequest);
    }
}

function onLoadGorna(e):void {
   var link:String = e.currentTarget.parameters.link;
   userSwf = e.currentTarget.content;
   userSwf.buttonMode = true;
   userSwf.addEventListener(MouseEvent.CLICK, function(e:MouseEvent) { afterClick(e, link ); });
   booksMC.addChild(userSwf);

   var childName:String = booksMC.getChildAt(childs).name;
   booksMC.getChildByName(childName).x = posX;
   booksMC.getChildByName(childName).y = 0;

   posX += 218;
   childs++;
}

После этого каждый загрузчик знает о своей ссылке.

person Serge Him    schedule 16.01.2013
comment
это действительно простое решение. Спасибо за это. Это мне очень помогает! - person Kamil; 17.01.2013
comment
Да!, это очень хорошее решение - person fenixkim; 17.01.2013

Проблема заключается в обработчике события для завершения события. вызвать функцию, которая возвращает новую функцию в качестве обработчика событий.

Сначала создайте такую ​​функцию:

function getCompleteHandler(url:String):Function {
    return function (e:Event) {
        onLoadGorna(e, url);
    }
}

Затем замените это:

mLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, myfunction = function(e:Event):void { onLoadGorna( e, String(Aktual[1]) ); } );

Этим:

mLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, getCompleteHandler(Aktual[1]) );

Теперь это должно работать!!

person fenixkim    schedule 16.01.2013
comment
твой ответ тоже правильный но Сережа Ним поступи проще. я ценю ваше время. Ваше здоровье - person Kamil; 17.01.2013