Хорошо.Чтобы ваш код работал, ypu должен изменить ваш основной класс следующим образом:
<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:local="*" xmlns:mx="library://ns.adobe.com/flex/mx"
xmlns:s="library://ns.adobe.com/flex/spark" creationComplete="init()">
<fx:Script>
<![CDATA[
import mx.controls.Alert;
protected function progressHandler():void
{
Alert.show("progressHandler outside");
}
protected function init():void
{
addEventListener("progressReady", progressReadyHandler);
}
private function progressReadyHandler(event:Event):void
{
progressHandler();
}
]]>
</fx:Script>
<fx:Declarations>
<local:IndependentClass id="ic" />
</fx:Declarations>
<s:Button click="{ic.click()}" />
</s:Application>
Проблема в том, что вы не установили объект, который правильно отправляет события.В вашем случае этот объект все еще является основным классом приложения.Чтобы достичь своей цели, вы должны воссоздать ваш IndependentClass
следующим образом:
package
{
import flash.events.Event;
import flash.events.EventDispatcher;
import flash.events.IEventDispatcher;
import mx.controls.Alert;
[Event(name="progressReady", type="flash.events.Event")]
public class ProperIndependentClass implements IEventDispatcher
{
public function ProperIndependentClass()
{
// This line initialized dispatching making this object target and currentTarget of the event
dispatcher = new EventDispatcher(this);
addEventListener("progressReady", progressReadyListener);
}
private var dispatcher:EventDispatcher;
public function addEventListener(type:String, listener:Function, useCapture:Boolean = false, priority:int = 0,
useWeakReference:Boolean = false):void
{
dispatcher.addEventListener(type, listener, useCapture, priority);
}
public function click():void
{
dispatchEvent(new Event("progressReady", true));
}
public function hasEventListener(type:String):Boolean
{
return dispatcher.hasEventListener(type);
}
public function removeEventListener(type:String, listener:Function, useCapture:Boolean = false):void
{
dispatcher.removeEventListener(type, listener, useCapture);
}
public function willTrigger(type:String):Boolean
{
return dispatcher.willTrigger(type);
}
public function dispatchEvent(evt:Event):Boolean
{
return dispatcher.dispatchEvent(evt);
}
public function progressReadyListener(e:Event):void
{
Alert.show("progressReadyListener inside");
}
}
}
Я прокомментировал строку в конструкторе, который выполняет всю магию.Более подробная информация доступна в официальной документации .
Итак, ваш основной класс будет выглядеть следующим образом:
<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:local="*" xmlns:mx="library://ns.adobe.com/flex/mx"
xmlns:s="library://ns.adobe.com/flex/spark">
<fx:Script>
<![CDATA[
import mx.controls.Alert;
protected function progressHandler():void
{
Alert.show("progressHandler outside");
}
]]>
</fx:Script>
<fx:Declarations>
<local:ProperIndependentClass id="ic" progressReady="progressHandler()" />
</fx:Declarations>
<s:Button click="{ic.click()}" />
</s:Application>
А как насчет [Event]
метатег.Это не что иное, как аннотация времени компиляции, которая помогает компилятору проверять атрибуты тегов MXML.Другое использование этого метатега - это завершение кода событий в IDE (как в MXML, так и в ActionScript при вводе addEventListener
).Это не имеет никакого влияния во время выполнения.
PS И Джеффри прав, говоря, что вы должны просто расширить EventDispatcher
.Цель IEventDispatcher
состоит в том, что ваш класс наследует какой-то другой класс, который не является производным от EventDispatcher
.В этом случае вы можете использовать композицию для решения проблемы диспетчеризации событий.В вашем случае ваш IndependentClass
не имеет требований не наследовать от EventDispatcher
.