2011-12-21 72 views
0

我一直在尝试这一点,现在我无法解决它。从Flex的外部AS类调度事件的问题

我有一个主要应用程序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文件处理请求,检查数据库并返回一些XML。 (这可能不是最好的方式,但在这一点上它确实不是太重要)。

如果用户成功登录,则xml将包含一个设置为true的状态属性。我在HTTP服务的结果事件处理程序中检查了这一点。这是一切都出错的地方。你可以看到,当用户成功登录时,我想分派一个自定义事件;如果没有,我会显示一个警告框。但是,这个事件并没有派遣(或者至少,我不知道如何去听)。

我想在我的主应用程序中侦听它,然后我可以将viewstate更改为登录状态。然而,事件似乎从来没有达到过。我通过在我的loginComponent上有loggedIn="loggedInHandler(event)"来收听。

任何想法如何做到这一点?提前致谢。我真的很感激任何帮助。

回答

1

首先,您的登录需要扩展事件调度程序或实现IEventDispatcher。我不知道为什么你会收到编译器错误,试图从它派发事件。

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

但是,您在这里有一个体系结构问题,您的视图不应该处理业务逻辑,它应该明确地不是在显示列表上创建不是其自己的子对象的新对象。

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

0

如果您派遣活动,那么对此活动感兴趣的人必须订阅此活动。 如果你从对象谁等待这个事件,然后LoginView实例分派事件中,你需要这样的台词:

loginViewInstance.addEventListemer("loggedIn", loggedInHandler);

和处理程序:

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

做你的需要。