![]() |
Как создать событие onLoad?
У меня есть класс Device. В нем я гружу данные из xml (с пом. класса XML).
У меня есть поле loaded:Boolean, которое сожержит загружен ли xml документ. НО... Я конечно могу постоянно проверять пока оно не станет true. Можно ли как-нибудь сделать событие наподобие XML.onLoad, которое бы вызывалось после того как мой xml обработан и загружен. Может просто приравнять как-нибудь функции XML.onLoad и мою Device.onLoad. Я пока не совсем знаю что говорю и как это сделать. Спасибо... :confused: |
Код:
... |
this.xml.onLoad = mx.utils.Delegate.create(this,this.onLoad);
MyXus, внешняя ссылка — это неправильно. |
хочется пофлеймить чуток..
1. а почему так уж неправильно? 2. Тогда уже можно просто XML.onLoad = this.onLoad; |
1. Потому что объявлять функции внутри метода вредно плюс лишние ссылки. Так делали в AS1.
2. Область видимости будет другой. |
Цитата:
|
А ты проверь.
|
Конечно респект, но я не понял как в итоге надо кодить-то? Можно 1-й и 2-й ответы объединить?! Спасибо..
PS. Как вообще работает класс Delegate? Где почитать? В книге по MX-версии такого еще не было. |
Выбирай :D
Я бы использовал Delegate. |
не могу понять
Помнишь, ты мне вчера помогал уже. Смотреть тут http://flasher.ru/forum/showthread.php?t=87123
У меня все это же. Так мне теперь писать this.xml.onLoad = mx.utils.Delegate.create(this,this.onXMLLoad); ??? И у меня в голове не укладыватся, как это будет работать? Мне вообще нужно как в визуальных средах программирования сделать событие. Объясню подробнее... У меня мой класс Device обрабатывает xml и забивает поля значениями из этого файла. Также есть методы, напр. getName(), кот. возващает имя девайса. Например, делаю следущее: Код:
var mobilePhone:Device = new Device("test.xml"); |
Класс XML не посылает событий, он только вызывает свой метод onLoad…
И мы его перенаправляем в наш класс. В AS3 это не требуется. |
Я пишу на AS2. А как сделать, чтобы я мог после обработки моего xml вызывать метод getName(), как в моем 10-м сообщении?
Конечно можно сделать цикл, который будет бесконечно крутиться, пока loaded не станет true или сделать задержку по таймеру (на то время примерно как загрузится xml), но тут один вариант глупее второго. |
ну дык варианты уже написали выше... То, что напмсал __etc пожалуй что более корректно, но нужно знать, как работает Delegate (очевидно =)
Вобщем, суть работы заключается в том, что он делает функцию одного класса так же функцией другого класса. Но в общем виде можно просто задать классу функцию и никак ее не определять в самом классе. А определить уже в ходе работы с элементом класса. Пример: Код:
class Xloader extends XML{Код:
var _xl:Xloader = new Xloader();Код:
class Xloader extends XML{Код:
var _xl:Xloader = new Xloader(); |
enepx, то, что тебе нужно, не получиться, ввиду асинхронности.
Нужно использовал событийную модель. Например, у меня есть класс AbstractXML и я работаю с ним так: Код:
… |
Лучше грузить данные в специальном классе который, для этого предназначен. Т.е. существует класс к примеру XMLLoader который может загружать в себя пачку XML из конфигурационного XML такого вида:
Код:
<settings>Код:
getXMLByName(name:String):XML;Код:
var mobilePhone:Device = new Device(_xmlLoader.getXMLByName("device1"));p.s. если интересует могу дать такой класс - сам писал давно достаточно, только там еще вагон и малегькая тележка классов и интерфейсов событийной модели... но если хочешь разобраться, то поделюсь с удовольствием p.s.2 _etc меня опередил :) |
Sneg, а твой getXMLByName что, сразу выдаст весь контент? А загружать его он когда будет?
з.Ы. Ты на полчаса опоздал :D |
Нет, это такой класс который на вход принимает:
Код:
init(url:String):Void; Код:
<settings>Код:
Код:
addListener(eventListener:IXMLLoaderListener):Boolean;Код:
addEventListener(listener:Object):Boolean; |
И нафига всем слушателям реализововать методы интерфейса, который к этим слушателям вообще толком не относится? А если тебе понадобиться реализовать в объекте другой интерфейс? А он у тебя уже реализует интерфейс XMLLoader… В общем, не суть важно, но твое решение, на мой взгляд, кривовато…
|
Объект может имплементировать несколько интерфейсов, через запятую: так что в этом не вижу проблемы. И как понять "вообще толком" не относится? Если он подписывается на события - он обязан слушать, вот пусть и слушает :)
|
Другое дело что, в основном слушателям в принципе плевать на всякие там onXMLLoaderProgress() им важно событие onXMLLoaderLoad(). В этом случае конечно приходится создавать пустые методы...
|
Я не пойму, а зачем, собственно, юзать интерфейс, когда твой класс может просто подписаться на необходимые события класса, без реализации всех методов интерфейса? Это бессмысленное использование интерфейсов, которые вообще созданы для того, чтобы общаться с классом, а не для того, чтобы просто прописать необходимые методы.
Интерфейс необходим, если класс, который его реализует, недоступен в конкретном проекте или пишется другим человеком, но тебе нужно работать с подобным классом. Впрочем, я догадываюсь, почему ты так используешь интерфейс — твой XMLLoader получает ссылку на интерфейс IXMLLoaderListener? А почему нельзя использовать событийную модель и вообще не делать связи внутри класса с внешними? |
Да безусловно может подписаться на событие, если в качестве ссылки на объект слушатель предеавать тип Object и заменить :
Код:
addListener(listener:XMLLoadListener):Boolean;Код:
addEventListener(listener:Object,event:EventObject):Boolean; |
Господа, я просто сделал так (влоб, причем давно): каждые 0,1sec проверяю чему равно isLoaded и все! Я думаю, что принцип работы всяких слушателей такой же - они слушают с какой-то частотой и все. Может я и не прав, но у меня все сейчас в норме. Спасибо...
|
| Часовой пояс GMT +4, время: 01:19. |
Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.