Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Вызов метода из другого файла, лежащего на уровне с вызывающим (http://www.flasher.ru/forum/showthread.php?t=172693)

Lyso 15.12.2011 13:38

Вызов метода из другого файла, лежащего на уровне с вызывающим
 
Допустим, у нас есть класс Main. Он создает объект класса ErrorWindow, у которого есть метод setMessage(msg:String);, где msg - сообщение, которое будет выводиться на экран.

Так же в Main есть экземпляр кнопки addBtn. Внутри класса этой кнопки есть слушатель события клика. После клика идет отправка данных на сервер и получает результат.

Каким образом можно передать результат внутри экземпляра кнопки в метод setMessgae();

Вот примерный код:

Main.as:
Код AS3:

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);
                }
 
        }
 
}

ErrorWindow.as
Код AS3:

package  
{
        import flash.display.Sprite;
 
        /**
        * ...
        * @author LysoSutriN
        */

        public class ErrorWindow extends Sprite
        {
 
                public function ErrorWindow()
                {
                        //Тут создается вид кнопки. Код не указан
                }
 
                public function setMessage(msg:String):void
                {
                        //Выводит кнопку на экран. Код не указан
                }
        }
 
}


Код AS3:

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 !!!
                }
 
        }
 
}

У меня несколько корявых идей. Например, можно передавать метод setMessage(); в видео аргумента кнопке, после чего вызывать через переменную. Это работает, но по-моему мнению это плохая практика.

Так же можно все слушатели, в том числе и клик, добавить в Main.as к экземпляру класса AddBtn.as, но код добавления данных очень громоздких и совсем не охота нагружать Main.as, так как он и так должен только вызывать методы из прочих классов.

Можно передавать тип ошибки через созданный класс MyEvent(type:String, bubbles:Boolean, cancelable:Boolean, myTypeError:String), но это громоздко и неудобно, получится, что и слушатели в Main и лишний код во всех классах.

Как лучше сделать. Лучше, чем мои корявые способы)

Kidd002 15.12.2011 13:48

Я бы использовал второй вариант. А громоздкий код добавления данных - это другая задача.

Genzo 15.12.2011 13:49

Код AS3:

//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);
    }
}


fish_r 15.12.2011 13:58

В вашем коде не видно - где добавляется кнопка на стейдж.
При таком раскладе посредников вам не избежать, а это лишний код по любому.
С другой стороны почему вы считаете плохой практикой передать ссылку на объект окна
в кнопку? Алерт-окно для того и сделано чтобы другие пользовались, ИМХО в этом страшного ничего нет.

Lyso 15.12.2011 13:59

Все-таки придется делать листенер в Main) Спасибо)

Добавлено через 1 минуту
Мне вполне подойдет вариант, представленный Genzo) Хоть я и хотел обойтись без dispatchEvent)

Genzo 15.12.2011 14:00

Я обычно делаю так :
Код AS3:

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);
    }
}

Добавлено через 2 минуты
Мне кажется singleton для таких вещей идеален

Lyso 15.12.2011 14:04

Обращаться через статичный метод к главному? Думаю, лучше будет
Код AS3:

public static function showError(text:String):void
    {
        ew.setMessage(text);
    }

Или не получится?

Добавлено через 1 минуту
Мне статичный метод не разрешает использовать переменную ew)

Добавлено через 3 минуты
Я не хочу удалять/создавать окно ошибки. Я просто меняю в нем текст и показываю его снова.

Genzo 15.12.2011 14:10

Код AS3:

public static var ew:ErrorWindow = new ErrorWindow();


fish_r 15.12.2011 14:11

потому, что ew должен инициализироваться в статик методе, либо тоже быть статиком

Lyso 15.12.2011 14:14

Все, сделал через статичный метод в классе Main.as) Думаю, вполне хорошее решение, учитываю, что я не меняю окно)

fish_r 15.12.2011 14:15

после таких завязок попробуйте оторвать ваш объект от Main(), например для использования в загружающем объекте, вот тогда и получите гемор

Lyso 15.12.2011 14:21

Не думаю, что могут возникнуть проблемы) А если вдруг возникнут - создам слушатель событий)


Часовой пояс GMT +4, время: 19:10.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.