我一直在尝试这一天,我无法解决这个问题。
我有一个主要应用程序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)"
来监听它。
知道怎么做吗?提前致谢。我真的很感激任何帮助。
答案 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
}
做你需要的。