PDA

Просмотр полной версии : Как реализован [Event] таг?


wvxvw
18.10.2008, 00:46
Собственно, вопрос такой: Хочу в MXML компоненте не наследующемся от UIComponent и вообще никак не связаном с ним получить такую же функциональность. Пока что результаты такие:
компонент успешно добавляется, функция-слушатель описаная в <mx:Script/> таге так же успешно в него дописывается, но не вызывается...
Компилятор не ругается, просто молчит =)
Мои подозрения - код МХМЛ должен каким-то образом быть передан либо самому компоненту, чтобы он от туда выудил информацию об евентах и подписал кого нужно на что нужно, либо компилятор должен сам это сделать... Т.е. я подозреваю, что компилятор должен вызвать у компонента какой-то метод, который эти евенты и добавит... читал сорцы UIComponent, но там вроде ничего такого нет...
Есть у кого-нибудь предположения на этот счет?

ЗЫ. небольшое уточнение: эксперимент с таймером показал, что листенер все-таки добавляется, но уже после того, как компонент создается, осталось только выяснить когда же это происходит...

7thsky™
18.10.2008, 01:44
А что нужно? Как реализован binding?

Сам таг [Event] - он (насколько знаю) для красоты :) Правда добавляется в байткод. + автокомплит в билдере.

Яски
18.10.2008, 01:52
http://the33cows.com/actionscript-30/2008/01/23/33/

wvxvw
18.10.2008, 02:48
Яски:
Пасиб, ссылка прикольная, было интересно почитать, но это не совсем в тему =)

7thsky™:
Не, наверное не правильно спросил, есть примерно следующее:
<?xml version="1.0"?>
<aswing:JApplication xmlns:aswing="http://www.aswing.org/"
xmlns:mx="http://www.adobe.com/2006/mxml" appInit="doInit(event)">

<mx:Script>
<![CDATA[
import flash.events.Event;

public function doInit(evt:Event):void
{
trace("foo");
}
]]>
</mx:Script>

</aswing:JApplication>
....
public function JApplication()
{
super();
if (stage != null) init();
else addEventListener(Event.ADDED_TO_STAGE, init);
}

protected function init(e:Event = null):void
{
AsWingManager.initAsStandard(this, true, false);
.....
testTimer.addEventListener(TimerEvent.TIMER, handleTimer);
testTimer.start();
trace(this["doInit"]); // есть такой
trace(hasEventListener(APP_INIT)); // но на событие не подписан
dispatchEvent(new Event(APP_INIT));
}

private function handleTimer(e:TimerEvent):void
{
trace(this["doInit"]); // естесственно есть
trace(hasEventListener(APP_INIT)); // и подписан!
}
....
Вопрос, кто и когда его подписал?

etc
18.10.2008, 13:22
Строчка в mxml «appInit="doInit(event)"» его и подписала, собственно.
А тег [Event] не более чем информационный.

7thsky™
18.10.2008, 13:39
Ух ты, Aswing во Flex'е, а можно вопрос а зачем?

wvxvw
18.10.2008, 15:08
__etc:
Да, я понимаю, что сам тег для информации / автокомплита =) Вопрос, очевидно, не правильно задал. Интересно когда вот эта строчка будет выполнена (т.е. листенер будет добавлен)
appInit="doInit(event)"
потому что она не выполняется до конструктора, хотя добавление скрипта из МХМЛя - да, добавляется до выполнения конструктора.

7thsky™:
Зачем? - ну, если чесно, то пока только ради эксперимента, просто интересно =) Ну а если получится, ну, хотя бы на столько чтобы основной функционал реализовать в МХМЛе - так для ASWinga есть сразу 4-5 скинов уже написаных (ну может и больше, я не особо искал) + он вообще красивше и чуть поменьше мх =)

ЗЫ. кстати, попробовал закоментить if (stage != null) init(); - так работает. Т.е. листенер был добавлен до того, как JApplication был была добавлена в дисплей лист.