Flex 3 - выдает параметры передачи через событие - PullRequest
1 голос
/ 03 августа 2010

Я застрял с проблемой и не могу понять, почему она так себя ведет ...

В цикле for я передаю индекс for в качестве параметра события. Однако eventHandler получает неправильный индекс, но правильную цель ...

Вот код. .as метод класса:

public function set dataProvider(a:Array):void
{
    var x:int = 0;
    if(a != null && a.length > 0)
    {   
        labelsArray = (new ArrayCollection(a));
        trace("##############################################################");
        for(var i:int = 0; i<a.length; i++)
        {
            var btn:NavigationArrowButtonCtrl = new NavigationArrowButtonCtrl();
            var s:String = (new ArrayCollection(a)).getItemAt(i).toString();
            trace(i + '/' + s);

            btn.addEventListener(FlexEvent.CREATION_COMPLETE, function(e:FlexEvent):void{
                var lblIndex:int = i;
                btnAddLblHandler(e, lblIndex);
            });

            this.addChild(btn); 
            this.setChildIndex(btn, 0);
        }
        trace("##############################################################");
    }
}

private function btnAddLblHandler(e:FlexEvent, ind:int):void
{
    trace(labelsArray.length.toString() + '/' + ind.toString());
    if(ind < labelsArray.length)
    {
        trace('Handler ' + ind + '/' + String(labelsArray.getItemAt(ind)));
        (e.target as NavigationArrowButtonCtrl).lbl_body.text = String(labelsArray.getItemAt(ind));
    }
}

Вот результат, который я получаю:

##############################################################
0/FINITION
1/> MOTORISATIONS
2/> EXTERIEUR
3/> INTERIEUR
4/> OPTIONS
5/> RESUME
##############################################################

6/6
6/6
6/6
6/6
6/6
6/6

Так или иначе, обработчик получает только последнее значение для индекса 'i', когда он должен получить в каждом цикле текущее значение 'i' (0/1/2/3/4/5) .. , Есть идеи, что случилось?

Спасибо за вашу помощь! знак равно С уважением,

BS_C3

Ответы [ 2 ]

1 голос
/ 03 августа 2010

К моменту создания кнопки и вызова var lblIndex:int = i; цикл for завершит свое выполнение, а значение i будет равно a.length, что здесь равно шести.Вы можете сгенерировать 5 различных функций или немного изменить дизайн.

function getListener(i:Number):Function {
     return function(e:FlexEvent):void{
         var lblIndex:int = i;
         btnAddLblHandler(e, lblIndex);
     };
}
btn.addEventListener(FlexEvent.CREATION_COMPLETE, getListener(i));

Похоже, вы пытаетесь установить метку NavigationArrowButtonCtrl элементов после их создания;более простой способ - объявить переменную [Bindable] внутри этого класса и связать ее с полем lbl_body.text.Если вы не собираетесь обновлять его позже, вам не нужно использовать привязку;вы можете просто обновить lbl_body.text из общедоступной переменной в обработчике creationComplete.

Таким образом код будет выглядеть следующим образом:

//in NavigationArrowButtonCtrl.mxml
public var textvar:String;

//inside the for loop:
btn.textvar = labelsArray.getItemAt(i).toString();
btn.addEventListener(FlexEvent.CREATION_COMPLETE, btnAddLblHandler)

//inside btnAddLblHandler(e:FlexEvent):void
btn.lbl_body.text = btn.textvar;

//you can do it from the NavigationArrowButtonCtrl class itself
this.lbl_body.text = this.textvar;

Не полагайтесь на e.target - используйте e.currentTarget вместо.target может быть некоторым потомком кнопки - у currentTarget всегда будет объект, с которым был зарегистрирован прослушиватель событий.

Кстати, не создавайте одну и ту же коллекцию массивов на каждой итерации цикла:

заменить:

var s:String = (new ArrayCollection(a)).getItemAt(i).toString();

на

var s:String = labelsArray.getItemAt(i).toString();
0 голосов
/ 03 августа 2010

Это то, что я сделал, чтобы решить проблему (область действия): -> Тот же код, что и раньше, просто инкапсулируя часть 'for' в функции.

public function set dataProvider(a:Array):void
{
    var x:int = 0;
    if(a != null && a.length > 0)
    {   
        labelsArray = (new ArrayCollection(a));
        trace("##############################################################");
        for(var i:int = 0; i<a.length; i++)
        {
            createBtn(i, a);
        }
        trace("##############################################################");
    }
}

private function createBtn(i:int, a:Array):void
{
    var btn:NavigationArrowButtonCtrl = new NavigationArrowButtonCtrl();
    var s:String = (new ArrayCollection(a)).getItemAt(i).toString();
    trace(i + '/' + s);

    btn.addEventListener(FlexEvent.CREATION_COMPLETE, function(e:FlexEvent):void{
            var lbl:String = s;
            btnAddLblHandler(e, lbl);
        }); 

    this.addChild(btn); 
}

private function btnAddLblHandler(e:FlexEvent, ind:int):void
{
    trace(labelsArray.length.toString() + '/' + ind.toString());
    if(ind < labelsArray.length)
    {
        trace('Handler ' + ind + '/' + String(labelsArray.getItemAt(ind)));
        (e.target as NavigationArrowButtonCtrl).lbl_body.text = String(labelsArray.getItemAt(ind));
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...