在Flex中从外部AS类调度事件时遇到问题

时间:2011-12-21 12:39:22

标签: flex events actionscript flex4 dispatchevent

我一直在尝试这一天,我无法解决这个问题。

我有一个主要应用程序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将包含一个设置为true的status属性。我在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!");
            }
        }

如您所见,当用户成功登录时,我想发送一个自定义事件;如果没有,我会显示一个警告框。但是,此事件不会发送(或者至少,我不知道如何倾听)。

我想在我的主应用程序中监听它,然后我可以将我的viewstate更改为登录状态。然而,事件似乎永远不会到达那里。我通过在我的loginComponent上使用loggedIn="loggedInHandler(event)"来监听它。

知道怎么做吗?提前致谢。我真的很感激任何帮助。

2 个答案:

答案 0 :(得分:1)

首先,您的Login需要扩展事件调度程序或实现IEventDispatcher。我不确定为什么你在尝试从中调度事件时会遇到编译器错误。

接下来,您需要侦听该事件的新Login实例。

但是,这里存在一个架构问题,即您的View不应该处理业务逻辑,并且它应该确定不在显示列表中创建不是它自己子节点的新对象。

相反,您应该从View中发出一个请求发生登录的事件,然后应该进一步处理该请求。根据应用程序的规模,这可以是主mxml文件或单独的控制器或命令逻辑。 可以让View在调度Event之前进行最少量的验证,但理想情况下你想要将这些东西封装到PresentationModel中(因为它更容易测试)。

答案 1 :(得分:0)

如果您发送活动,那么对此活动感兴趣的人必须订阅此活动。 如果从LoginView实例调度事件,那么在等待此事件的对象中,您需要这样的行:

loginViewInstance.addEventListemer("loggedIn", loggedInHandler);

并在处理程序中:

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

做你需要的。