Передача дополнительных параметров для ваших обратных вызовов возможна с помощью некоторой функции делегата или замыкания. Однако это часто считается плохой практикой. Вместо этого вы можете использовать свойство события target
для определения индекса на основе FileReference
.
Редактировать: Вот пример использования замыканий:
function getTimerClosure(ind : int) : Function {
return function(event : TimerEvent) {
trace(ind);
};
}
for (var i = 0; i < 10; i++) {
var tm : Timer = new Timer(100*i+1, 1);
tm.addEventListener(TimerEvent.TIMER, getTimerClosure(i));
tm.start();
}
При этом будут непрерывно отслеживаться числа от 0 до 9.
Edit2: Вот пример создания делегата на основе закрытия функции:
function timerHandler(event : Event, ...rest) : void {
trace(event, rest);
}
function Delegate(scope : Object, func : Function, ...rest) : Function {
return function(...args) : void {
func.apply(scope, args.concat(rest));
}
}
var tm : Timer = new Timer(1000, 1);
tm.addEventListener(TimerEvent.TIMER, Delegate(this, this.timerHandler, 1, 2, 3));
tm.start();
Однако это плохой подход, поскольку отписка для такого слушателя - адская боль. Это, в свою очередь, может вызвать утечку памяти, что снизит общую производительность вашего приложения. Так что используйте с осторожностью!
Итог: если вы знаете, как работать с замыканиями, используйте их - это замечательная вещь! Если вам не важна производительность вашего приложения в долгосрочной перспективе, используйте замыкания - это просто!
Но если вы не уверены в замыканиях, используйте более традиционный подход. Например. в вашем случае вы можете создать Dictionary
, который сопоставит ваши FileReference
объекты с соответствующими индексами. Примерно так:
var frToInd : Dictionary = new Dictionary(false);
// false here wouldn't prevent garbage collection of FileReference objects
for (var i : int = 0; i < 10; i++) {
// blah-blah stuff with `lib` objects
frToInd[lib.fileRef] = i;
// another weird stuff and subscription
}
function eventListener(event : Event) : void {
// in the event listener just look up target in the dictionary
if (frToInd[event.target]) {
var ind : int = frToInd[event.target];
} else {
// Shouldn't happen since all FileReferences should be in
// the Dictionary. But if this happens - it's an error.
}
}
- Удачного кодирования!