0

我已经尝试了一天,但我无法解决。

我有一个主要的应用程序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。我在 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)"

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

4

2 回答 2

1

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

接下来,您需要监听该事件的新登录实例。

但是,您在这里遇到了一个架构问题,即您的视图不应该处理业务逻辑,并且它绝对不应该在显示列表上创建不是它自己的子对象的新对象。

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

于 2011-12-21T15:28:15.343 回答
0

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

loginViewInstance.addEventListemer("loggedIn", loggedInHandler);

在处理程序中:

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

做你需要的。

于 2011-12-21T15:16:07.730 回答