Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache flex 交换主Flex应用程序_Apache Flex - Fatal编程技术网

Apache flex 交换主Flex应用程序

Apache flex 交换主Flex应用程序,apache-flex,Apache Flex,是否有一种方法可以临时将Flex的主应用程序交换到另一个应用程序,然后再切换回来。 场景:主应用程序启动,显示登录框-然后继续主应用程序。登录框也是一个应用程序 Application.Application是一个只读属性,尝试失败。为什么不能将登录框设置为组件,然后使用ViewStack控制可查看的组件?这很有趣,这正是我目前试图找出的最佳方法。我曾想过使用ViewStack,但由于我已经使用了许多其他嵌套的ViewStack,所以我还研究了State标记。如果有人知道该做什么,我也会很感兴趣

是否有一种方法可以临时将Flex的主应用程序交换到另一个应用程序,然后再切换回来。 场景:主应用程序启动,显示登录框-然后继续主应用程序。登录框也是一个应用程序


Application.Application是一个只读属性,尝试失败。

为什么不能将登录框设置为组件,然后使用ViewStack控制可查看的组件?

这很有趣,这正是我目前试图找出的最佳方法。我曾想过使用ViewStack,但由于我已经使用了许多其他嵌套的ViewStack,所以我还研究了State标记。如果有人知道该做什么,我也会很感兴趣的

我已经在应用程序组件上将其实现为ViewStack;看起来很好用。使用ViewStack上的selectedIndex或selectedChild属性控制是显示登录还是显示应用程序UI

<mx:Application>
  <mx:ViewStack>
    <mx:Box> <!-- or whatever for login-->
    </mx:Box>
    <mx:Box> <!-- application UI widgets here -->
    </mx:Box>
  </mx:ViewStack>
</mx:Application>

我在模块化应用程序方面取得了巨大成功,主要应用程序基本上由模块加载器组成,模块加载器最初加载登录模块

一旦登录模块完成了它的工作(在我的例子中是经过验证的输入,称为登录服务并检索到一个令牌),它就会发送一个事件(想象中称为“LogonEvent”),其中包含主应用程序所需的详细信息。我应该指出,登录模块本身只是完成所有实际工作的登录组件的包装器(因此登录组件可以在模块或ViewStack等中使用)。拥有一个LogonEvent会让一切变得不同

包装器应用程序通过卸载登录模块、加载包含应用程序核心的主模块来处理登录事件,然后在加载的模块上设置所需的登录详细信息

注销按钮位于包装器应用程序中,以便卸载主模块并重新加载登录模块,以便再次登录

这种布局的好处是相对较小的登录模块加载速度非常快。当用户登录时,主模块已经被预加载,因此通常不需要等待主模块在登录后加载。如果您有一个大型单片应用程序,那么初始加载时间可能会延迟

一些可能有帮助的代码

private var mainModuleLogOnEventDispatcher:*;

[Bindable]
private var _logOnDetails:LogOnDetails = new LogOnDetails();

private function onCreationComplete(event:Event):void
{
    // Load log on module.
    loadMainModule("LogOnModule.swf");

    // Pre-load main module while user is logging on.
    var mm:IModuleInfo = ModuleManager.getModule("MainModule.swf");
    mm.load();
}

[Bindable]
private function set logOnDetails(value:LogOnDetails):void
{
    _logOnDetails = value;
}

private function get logOnDetails():LogOnDetails
{
    return _logOnDetails;
}           

private function loadMainModule(moduleName:String):void
{
    // Unload anything already loaded.
    if (mainModule.url.length > 0)
    {
        mainModule.unloadModule();
        mainModule.url = "";
    }
    mainModule.addEventListener(ModuleEvent.READY, handleMainModuleReadyEvent);
    mainModule.url = moduleName;
}

private function handleMainModuleReadyEvent(event:ModuleEvent):void
{
    // Remove listener, we've caught the event now.
    mainModule.removeEventListener(ModuleEvent.READY, handleMainModuleReadyEvent);

    // Add listeners to other events or apply data.
    if (mainModule.url == "LogOnModule.swf")
    {
        mainModuleLogOnEventDispatcher = mainModule.child;
        if (mainModule.child != null) {
            mainModuleLogOnEventDispatcher.addEventListener("logOnEvent", handleLogOnEvent);
        }
    }
    if (mainModule.url == "MainModule.swf")
    {
        var mm:* = mainModule.child;
        if (mainModule.child != null)
        {
            mm.logOnDetails = logOnDetails;
        }
    }                                           
}

private function handleLogOnEvent(logOnEvent:LogOnEvent):void
{
    mainModuleLogOnEventDispatcher.removeEventListener("logOnEvent", handleLogOnEvent);

    logOnDetails = logOnEvent.logOnDetails;

    // Now get person's details and swap in main module if successful.
    var parameters:Object = new Object();
    parameters.cmd = "viewPerson";
    parameters.token = logOnDetails.logOnToken;
    viewPersonRequest.send(parameters);
}

private function handleViewPersonRequestResult(event:ResultEvent):void
{

    //*** Loads of setting logonDetails and error handling removed!!! ***//
    loadMainModule("MainModule.swf");
    currentState = "LoggedOn";
    return;
}

private function onLogOff(event:MouseEvent):void
{
    // Make sure we don't auto-logon when we log off.
    var logOnPrefs:SharedObject = SharedObject.getLocal("LogOn", "/");
    logOnPrefs.data.loggedOff = true;

    var parameters:Object = new Object();
    parameters.cmd = "logoff";
    parameters.token = logOnDetails.logOnToken;
    logoffRequest.send(parameters);
    loadMainModule("LogOnModule.swf");
    currentState = "";
}

<!-- *** Loads of view state related mxml removed *** -->
<mx:VBox width="100%" height="100%" horizontalAlign="center" verticalAlign="middle" id="mainModuleVBox">
    <basic:IJModuleLoader id="mainModule" url="" width="100%" height="100%" horizontalAlign="center" verticalAlign="middle"/>
</mx:VBox>
private var mainModuleLogOnEventDispatcher:*;
[可装订]
私有变量_logndetails:logndetails=newlogndetails();
私有函数onCreationComplete(事件:事件):void
{
//加载登录模块。
loadMainModule(“LogOnModule.swf”);
//在用户登录时预加载主模块。
变量mm:IModuleInfo=ModuleManager.getModule(“MainModule.swf”);
mm.荷载();
}
[可装订]
私有函数集logOnDetails(值:logOnDetails):void
{
_logOnDetails=值;
}
私有函数get logOnDetails():logOnDetails
{
返回_logOnDetails;
}           
私有函数loadMainModule(moduleName:String):void
{
//卸载已加载的任何内容。
如果(mainModule.url.length>0)
{
mainModule.unloadModule();
mainModule.url=“”;
}
mainModule.addEventListener(ModuleEvent.READY,handleMainModuleReadyEvent);
mainModule.url=moduleName;
}
私有函数handleMainModuleReadyEvent(事件:ModuleEvent):void
{
//删除侦听器,我们现在已捕获事件。
mainModule.removeEventListener(ModuleEvent.READY,handleMainModuleReadyEvent);
//将侦听器添加到其他事件或应用数据。
if(mainModule.url==“LogOnModule.swf”)
{
mainModuleLogOnEventDispatcher=mainModule.child;
if(mainModule.child!=null){
mainModuleLogOnEventDispatcher.addEventListener(“logOnEvent”,handleLogOnEvent);
}
}
if(mainModule.url==“mainModule.swf”)
{
var mm:*=mainModule.child;
if(mainModule.child!=null)
{
mm.logOnDetails=logOnDetails;
}
}                                           
}
私有函数handleLogOnEvent(logOnEvent:logOnEvent):无效
{
mainModuleLogOnEventDispatcher.removeEventListener(“logOnEvent”,handleLogOnEvent);
logOnDetails=logOnEvent.logOnDetails;
//现在获取人员的详细信息,如果成功,则在主模块中交换。
变量参数:对象=新对象();
parameters.cmd=“viewPerson”;
parameters.token=logOnDetails.logOnToken;
viewPersonRequest.send(参数);
}
私有函数handleViewPersonRequestResult(事件:ResultEvent):void
{
//***已删除设置logonDetails和错误处理的加载***//
loadMainModule(“MainModule.swf”);
currentState=“LoggedOn”;
返回;
}
私有函数onLogOff(事件:MouseEvent):无效
{
//确保注销时不会自动登录。
var logOnPrefs:SharedObject=SharedObject.getLocal(“LogOn”,“/”;
logOnPrefs.data.loggedOff=true;
变量参数:对象=新对象();
parameters.cmd=“注销”;
parameters.token=logOnDetails.logOnToken;
logoffRequest.send(参数);
loadMainModule(“LogOnModule.swf”);
currentState=“”;
}
我还应该注意,这个包装器应用程序实际上不是一个应用程序!这实际上是一个模块本身,由Flex或AIR应用程序加载。通过这种方式,我可以拥有单独的Flex和AIR项目,它们引用一个核心库项目,该项目包含应用程序模块、登录模块、主(登录后)模块以及应用程序使用的基本上所有其他组件和类