К моменту создания кнопки и вызова 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();