【问题标题】:Send data from popup to main application.将数据从弹出窗口发送到主应用程序。
【发布时间】:2011-10-18 04:47:27
【问题描述】:

我没有得到我正在寻找的答案。 我想将获得的请求数据发送到主应用程序。

    <?xml version="1.0" encoding="utf-8"?>
<mx:TitleWindow xmlns:mx="http://www.adobe.com/2006/mxml"  remove="titlewindow1_removeHandler(event)"
                width="400" height="220" layout="absolute" title="USER LOGIN">
    <mx:Metadata>
        [Event(name="commEvent", type="flash.events.Event")]
    </mx:Metadata>
    <mx:Script>
        <![CDATA[
            import data.Data;

            import mx.events.FlexEvent;
            import mx.managers.PopUpManager;


            [Bindable]
            public var userID:String;

            private function loginUser():void{
                trace("btn");
                var req:URLRequest = new URLRequest('http://localhost/CCN/userProcess.php');
                var loader:URLLoader = new URLLoader();
                req.method="POST";

                var variables:URLVariables = new URLVariables();
                variables.email= username.text;
                variables.password= password.text;
                variables.action= "login_user";
                req.data=variables;

                loader.addEventListener(Event.COMPLETE,onDataLoaded);
                loader.load(req);
            }
            protected function loginButton_clickHandler(event:MouseEvent):void
            {
                // TODO Auto-generated method stub

                loginUser();
            }


            private function onDataLoaded(e:Event):void{
                var xml:XML= new XML(e.target.data);
                if(xml.status=="success"){

                //SEND DATA TO MAIN APPLICATION ????
                    PopUpManager.removePopUp(this);

                }else{
                    fail.visible=true;
                    username.text="";
                    password.text="";
                    username.setFocus();
                }


            }

            protected function loginButton_keyDownHandler(ee:KeyboardEvent):void
            {
                // TODO Auto-generated method stub
                if(ee.keyCode==13){
                    loginUser();
                }
            }

            protected function titlewindow1_removeHandler(event:FlexEvent):void
            {
                // TODO Auto-generated method stub

            }

        ]]>
    </mx:Script>

    <mx:TextInput id="username" x="141" y="31" width="199" text=""/>
    <mx:TextInput keyDown="loginButton_keyDownHandler(event)" text="000" id="" x="141" y="84" width="199" displayAsPassword="true"/>
    <mx:Button id="loginButton" x="275" y="133" label="LOGIN" click="loginButton_clickHandler(event)"/>
    <mx:Label x="22" y="33" text="Email"/>
    <mx:Label x="22" y="86" text="Password"/>
    <mx:Label x="22" visible="false" y="135" id="fail" color="#FF0000" text="LOGIN FAILED"/>
</mx:TitleWindow>

这是主要的应用程序代码

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
                minWidth="955" minHeight="600" backgroundColor="#FFFFFF"
                creationComplete="application1_creationCompleteHandler(event)" layout="absolute">
    <mx:Script>
        <![CDATA[
            import mx.containers.TitleWindow;
            import mx.core.IFlexDisplayObject;
            import mx.events.CloseEvent;
            import mx.events.FlexEvent;
            import mx.managers.PopUpManager;

            //private var loginWindow:TitleWindow;
            public var user:String;
            private var login:Login

            private function application1_creationCompleteHandler(event:FlexEvent):void
            {
                // TODO Auto-generated method stub
                login = Login(
                    PopUpManager.createPopUp(this, Login, true));
                PopUpManager.centerPopUp(login);


                //login['loginButton'].addEventListener(MouseEvent.CLICK,onClose);
                login.addEventListener(CloseEvent.CLOSE,oncc)

            }
            private function onClose(e:Event):void{
                trace("Trace : "+login.userID);
            }
            private function


        ]]>
    </mx:Script>
</mx:Application>

【问题讨论】:

    标签: actionscript-3 popup custom-component custom-event


    【解决方案1】:

    我建议通过添加自定义事件来解决此问题,因为您的标签暗示您可能理解。

    如果没有,请按照以下步骤操作。

    1) 创建一个新的 Event 类型(在 actionscript 中扩展 Event 类 - 一定要覆盖 clone())

    2) 在弹出窗口的父应用程序中为您的新事件类型添加事件侦听器

    3) 使弹出窗口在关闭之前调度您的新事件类型

    4) 在事件处理程序中处理您要查找的任何内容(用户 ID?)。

    我建议将 userID 附加到实际事件中,这样父级就不会直接寻址 login.userID。从松耦合的角度来看,它更正确。也就是说,如果您不想这样做,您可以通过不附加用户 ID 来简化解决方案。松散耦合是一个很好的目标,但是如果您只打算使用这种关系一次,那么它并不是非常必要的。

    如果您选择走更紧密的耦合路线,那么您只需要使用自定义“类型”而不是扩展事件来调度事件。

    如果您需要较低级别的示例(更少描述,更多代码),请告诉我,我也可以提供帮助。

    下面提供的示例是稍微复杂一点的版本,您可以在其中扩展一个事件以包含数据。

    事件类::

    package mycomponents
    {
        import flash.events.Event;
        public class CustomEvent extends Event
        {
            public static const EVENT_TYPE_NAME:String = "myEventType"
    
            public var mUserID:String = "";
            public var mSuccess:Boolean = false;
    
            public function CustomEvent(aType:String, aUserID:String, aSuccess:Boolean)
            {
                super(aType)
                mUserID = aUserID;
                mSuccess = aSuccess;
            }
    
            override public function clone():Event
            {
                var lEvent:CustomEvent = new CustomEvent(mUserID, mSuccess);
                return lEvent;
            }
        }
    }
    

    在弹出窗口中::

    private var loginSuccessful:Boolean = false;
    
    private function onDataLoaded(e:Event):void{
        var xml:XML= new XML(e.target.data);
        if(xml.status=="success"){
    
            userID = username.text;
            loginSuccessful = true;             
            //SEND DATA TO MAIN APPLICATION
            dispatchEvent(new CustomEvent(CustomEvent.EVENT_TYPE_NAME, userID, loginSuccessful );
            PopUpManager.removePopUp(this);
    
        }else{
            fail.visible=true;
            username.text="";
            password.text="";
            username.setFocus();
        }           
    }
    
    protected function titlewindow1_removeHandler(event:FlexEvent):void
    {          
        if (!loginSuccessful)
            dispatchEvent(new CustomEvent(CustomEvent.EVENT_TYPE_NAME," userID, loginSuccessful ));
    } 
    

    在主应用程序中::

    import mycomponents.CustomEvent;
    
    private function application1_creationCompleteHandler(event:FlexEvent):void 
    {
        //...your code
        login.addEventListener(CustomEvent.EVENT_TYPE_NAME, handleLoginEvent);
    }
    
    private function handleLoginEvent(aEvent:CustomEvent)
    {
        //My example code dispatches an event with mSuccess = false if the login prompt closes
        //without a successful login
        //
        //now do whatever you want with the information from the popup
        //aEvent.mUserID gets you ID
        //aEvent.mSuccess gets you success
    
    }
    

    在工作休息的时候把它放在一起,所以没有任何承诺会按原样编译。

    【讨论】:

    • 我试图找出自定义事件...虽然并没有真正得到它。一些代码会很棒...thanx
    • @kma,代码在那里,看看。如果您需要更多,请随时询问。
    猜你喜欢
    • 1970-01-01
    • 2010-11-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多