|
|
« Предыдущая тема | Следующая тема » |
Опции темы | Опции просмотра |
|
|
|||||
Вызов метода из другого файла, лежащего на уровне с вызывающим
Допустим, у нас есть класс Main. Он создает объект класса ErrorWindow, у которого есть метод setMessage(msg:String);, где msg - сообщение, которое будет выводиться на экран.
Так же в Main есть экземпляр кнопки addBtn. Внутри класса этой кнопки есть слушатель события клика. После клика идет отправка данных на сервер и получает результат. Каким образом можно передать результат внутри экземпляра кнопки в метод setMessgae(); Вот примерный код: Main.as: package { import flash.display.Sprite; import flash.events.Event; /** * ... * @author LysoSutriN */ public class Main extends Sprite { public var ew:ErrorWindow = new ErrorWindow(); //Окно ошибки private var addBtn:AddBtn; public function Main():void { if (stage) init(); else addEventListener(Event.ADDED_TO_STAGE, init); } private function init(e:Event = null):void { removeEventListener(Event.ADDED_TO_STAGE, init); createInterface(); } private function createInterface():void { addChild(ew); addChild(addNotebook); } } } package { import flash.display.Sprite; /** * ... * @author LysoSutriN */ public class ErrorWindow extends Sprite { public function ErrorWindow() { //Тут создается вид кнопки. Код не указан } public function setMessage(msg:String):void { //Выводит кнопку на экран. Код не указан } } } package { import flash.events.Event; import flash.display.Sprite; import flash.events.MouseEvent; /** * ... * @author LysoSutriN */ public class AddBtn extends Sprite { public function AddBtn() { //Тут рисуем кнопку. Код не указан addEventListener(MouseEvent.CLICK, clickListener); } private function clickListener(e:MouseEvent):void { //происходит загрузка данных на сервер. Код не указан [myLoader].addEventListener(Event.COMPLETE, completeListener); } private function completeListener(e:Event):void { //!!! Тут у нас текст, который нужно отправить в setMessage !!! } } } Так же можно все слушатели, в том числе и клик, добавить в Main.as к экземпляру класса AddBtn.as, но код добавления данных очень громоздких и совсем не охота нагружать Main.as, так как он и так должен только вызывать методы из прочих классов. Можно передавать тип ошибки через созданный класс MyEvent(type:String, bubbles:Boolean, cancelable:Boolean, myTypeError:String), но это громоздко и неудобно, получится, что и слушатели в Main и лишний код во всех классах. Как лучше сделать. Лучше, чем мои корявые способы)
__________________
Humanity.push(new Man()); Последний раз редактировалось Lyso; 15.12.2011 в 13:41. |
|
|||||
Я бы использовал второй вариант. А громоздкий код добавления данных - это другая задача.
|
|
|||||
//new Class public class MyEvent extends Event{ public static const ERROR:String = "myErrorEvent"; private var _message:String; public function MyEvent(type:String, message:String = "" ,bubbles:Boolean=false, cancelable:Boolean=false) { this._message = message; super(type, bubbles, cancelable); } public function get message():String { return this._message; } } ///................ Main AddBtn.addEventListener(MyEvent.ERROR , onError); private function onError(e:MyEvent):void { addBtn.setMessgae(e.message); } //Button.... public class AddBtn extends Sprite { private function completeListener(e:Event):void { //!!! Тут у нас текст, который нужно отправить в setMessage !!! dispatchEvent(new MyEvent(MyEvent.ERROR , text); } }
__________________
Gamedev != Gaming (http://twitter.com/#!/GenzoDev). Don't forget to [+] if it works. |
|
|||||
В вашем коде не видно - где добавляется кнопка на стейдж.
При таком раскладе посредников вам не избежать, а это лишний код по любому. С другой стороны почему вы считаете плохой практикой передать ссылку на объект окна в кнопку? Алерт-окно для того и сделано чтобы другие пользовались, ИМХО в этом страшного ничего нет. |
|
|||||
Все-таки придется делать листенер в Main) Спасибо)
Добавлено через 1 минуту Мне вполне подойдет вариант, представленный Genzo) Хоть я и хотел обойтись без dispatchEvent)
__________________
Humanity.push(new Man()); |
|
|||||
Я обычно делаю так :
public class Main extends Sprite { private var addBtn:AddBtn; public function Main():void { if (stage) init(); else addEventListener(Event.ADDED_TO_STAGE, init); } private function init(e:Event = null):void { removeEventListener(Event.ADDED_TO_STAGE, init); rootStage = stage; createInterface(); } private function createInterface():void { addChild(ew); addChild(addNotebook); } public static var rootStage:Stage; public static function showError(text:String):void { if(rootStage){ var ew:ErrorWindow = new ErrorWindow(); ew.label1.text = text; rootStage.addChild(ew); } } } //Button.... public class AddBtn extends Sprite { private function completeListener(e:Event):void { //!!! Тут у нас текст, который нужно отправить в setMessage !!! Main.showError(text); } } Мне кажется singleton для таких вещей идеален
__________________
Gamedev != Gaming (http://twitter.com/#!/GenzoDev). Don't forget to [+] if it works. Последний раз редактировалось Genzo; 15.12.2011 в 14:02. |
|
|||||
Обращаться через статичный метод к главному? Думаю, лучше будет
Или не получится? Добавлено через 1 минуту Мне статичный метод не разрешает использовать переменную ew) Добавлено через 3 минуты Я не хочу удалять/создавать окно ошибки. Я просто меняю в нем текст и показываю его снова.
__________________
Humanity.push(new Man()); |
|
|||||
__________________
Gamedev != Gaming (http://twitter.com/#!/GenzoDev). Don't forget to [+] if it works. |
|
|||||
Все, сделал через статичный метод в классе Main.as) Думаю, вполне хорошее решение, учитываю, что я не меняю окно)
__________________
Humanity.push(new Man()); |
Часовой пояс GMT +4, время: 12:43. |
|
« Предыдущая тема | Следующая тема » |
|
|