Проблема с отправкой событий из внешнего класса AS во Flex - PullRequest
0 голосов
/ 21 декабря 2011

Я пробовал это в течение дня и не могу разобраться.

У меня есть основное приложение Planner.mxml. В этом представлении есть несколько пользовательских компонентов, один из которых LoginView.mxml. В LoginView.mxml я делаю следующее:

protected function btnLoginClick(event:MouseEvent):void
{
    try
    {
        var login:Login = new Login(txtEmail.text, txtPassword.text);       
    } 
    catch(error:Error) 
    {
        Alert.show(error.message, "Oops!");
    }
}

Я создаю новый экземпляр моего Login класса и отправляю некоторые параметры в конструктор. Мой конструктор выглядит так:

public function Login(email:String, password:String)
        {
            if(email == "" || password == "")
            {
                throw new Error("Please complete all fields.");
            }
            else
            {
                var loginRequest:HTTPService = new HTTPService();
                var parameters:Object = new Object();

                parameters.email = email;
                parameters.password = password;

                loginRequest.url = Globals.LOGIN_URL;
                loginRequest.resultFormat = "object";
                loginRequest.method = "POST";
                loginRequest.addEventListener("result", loginHandleResult);
                loginRequest.addEventListener("fault", loginHandleFault);
                loginRequest.send(parameters);
            }
        }

Здесь я проверяю, заполнены ли все поля, и если да, я помещаю параметры конструктора в объект параметров, который я затем отправляю в HTTPService, который представляет собой простой файл PHP, который обрабатывает запрос, проверяет с помощью db и возвращает немного XML. (Возможно, это не самый лучший способ, но на данный момент это не так уж важно).

Если пользователь успешно вошел в систему, xml будет содержать свойство status, для которого установлено значение true. Я проверяю это в обработчике события результата службы HTTP. Здесь все идет не так, как надо.

protected function loginHandleResult(event:ResultEvent):void
        {
            if(event.result.status == true)
            {
                trace("logged in");
 // here stuff goes wrong
                var e:LoggedInEvent = new LoggedInEvent("loggedIn");
                dispatchEvent(e);
            }
            else
            {
                trace("not logged in");
                Alert.show("Wrong credentials.", "Oops!");
            }
        }

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

Я хотел бы прослушать его в моем основном приложении, где я могу затем изменить свое состояние просмотра в состояние входа в систему. Тем не менее, событие никогда не кажется, чтобы туда добраться. Я слушаю это, имея loggedIn="loggedInHandler(event)" на моем loginComponent.

Есть идеи, как это сделать? Заранее спасибо. Буду очень признателен за любую помощь.

Ответы [ 2 ]

1 голос
/ 21 декабря 2011

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

Далее вам необходимо прослушать новый экземпляр Login для этого события.

Однако у вас естьздесь архитектурная проблема, заключающаяся в том, что ваше представление не должно обрабатывать бизнес-логику, и оно НЕ ДОЛЖНО создавать новые объекты, которые не являются его дочерними элементами в списке отображения.

Вместо этого вам следует отправлять событие из представления, котороеПРЕДЛАГАЕТ, что вход в систему происходит, и затем этот запрос должен быть обработан далее.В зависимости от масштаба вашего приложения это может быть основной файл mxml или отдельный контроллер или командная логика.Это нормально нормально для View, чтобы выполнить минимальную проверку перед отправкой события, но в идеале вы хотели бы инкапсулировать этот материал в PresentationModel (потому что это проще для тестирования).

0 голосов
/ 21 декабря 2011

Если вы отправляете событие, то тот, кто заинтересован в этом событии, должен подписаться на это событие.Если вы отправляете событие из экземпляра LoginView, тогда в объекте, который ожидает это событие, вам нужны такие строки:

loginViewInstance.addEventListemer("loggedIn", loggedInHandler);

и в обработчике:

private function loggedInHandler(event:LoggedInEvent):void
{
    //do something 
}

делайте то, что вынеобходимо.

...