Как я могу использовать класс Event от Starling и Flash в одном классе
Работая со Starling, я столкнулся с этой проблемой. Иногда важно использовать событие Flash.
import starling.events.Event;
import flash.events.Event ;
var _myFile_Fr:FileReference = new FileReference();
_myFile_Fr.addEventListener(Event.COMPLETE, onFileLoaded);
_myFile_Fr.load();
function onFileLoaded(event:Event ):void
{
trace( event.target.data ) // <<<< compiler error:
}
Доступ к возможно неопределенным данным свойства через ссылку со статическим типом starling.events:EventDispatcher
Я пытался использовать полную спецификацию
function someEventHandler(event:flash.events.Event ):void
{
....
}
Также так:
_myFile_Fr.addEventListener(flash.events.Event.COMPLETE, onFileLoaded);
_myFile_Fr.load();
function onFileLoaded(e:Event ):void
{
trace( e.target.data );
}
Но вышеупомянутое не работает, и показывает ошибку времени компиляции.
доступ к неопределенному свойству Flash
Тогда какой выход?
Доступ к возможно неопределенным данным свойства через ссылку со статическим типом starling.events:EventDispatcher. С flash.events.Event все работает нормально.
4 ответа
Проблема вызвана тем, что компилятор считает, что нужное вам событие - starling.events.Event. События Starling имеют атрибут target
но это (в отличие от событий flash) имеет определенный тип EventDispatcher
где флеш просто универсальный Object
, Поэтому, когда вы ищете event.target.data
вы пытаетесь найти атрибут data
на скромный объект EventDispatcher. В классе EventDispatcher отсутствует атрибут данных, поэтому он выдает эту ошибку.
Вы должны быть осторожны, что, когда у вас есть и starling.events.Event, и flash.events.Event, вам нужно будет указать, какой именно вы ожидаете (используя его полное имя).
public function onLoad(event:flash.events.Event):void
или же
public function onLoad(event:starling.events.Event):void
но нет
public function onLoad(event:Event):void
если только вы не импортировали события flash или starling, но не оба одновременно.
Единственный способ, который я нашел, - нигде не использовать имя класса Event. Итак, что сработало для меня это:
import starling.events.Event;
var _myFile_Fr:FileReference = new FileReference();
_myFile_Fr.addEventListener(Event.COMPLETE, onFileLoaded);
_myFile_Fr.load();
function onFileLoaded(event):void //<< Don't use class name specification
{
trace( event.target.data )
}
доступ к неопределенному свойству Flash
Вы правы, что вам нужно использовать полное имя класса flash.events.Event
Но я подозреваю, что вы сделали опечатку. Обратите внимание, что ошибка говорит Flash
где первая буква заглавная. ActionScript чувствителен к регистру, поэтому Flash.events.Event
не будет работать. Это должно быть flash.events.Event
где flash
это все строчные.
import starling.events.Event;
import flash.events.Event;
var _myFile_Fr:FileReference = new FileReference();
_myFile_Fr.addEventListener(flash.events.Event.COMPLETE, onFileLoaded);
_myFile_Fr.load();
function onFileLoaded(event:flash.events.Event):void
{
//see below for changes
}
Доступ к возможно неопределенным данным свойства через ссылку со статическим типом starling.events:EventDispatcher
Это означает именно то, что говорится. target
свойство события набирается как EventDispatcher
, Если вы знаете, что это что-то более конкретное, вам нужно разыграть его следующим образом:
var file:FileReference = FileReference(event.target);
trace( file.data );
Объекты события передаются в качестве параметров слушателям событий, когда происходит событие. Это версия Starling класса Flash Event.
этот класс делает все это flash.events.Event
делал раньше со своими дополнительными опциями. В чем было бы преимущество использования импорта flash.events.Event в вашем случае?
тем не мение
addEventListener(flash.events.Event.ADDED, handler);
function handler(e:flash.events.Event) {}
не вызывает никаких ошибок в обычном порядке.
Тоже из Старлинга
В этом случае вы можете создать подкласс "Событие" и добавить свойства со всей необходимой вам информацией.