Замена основного приложения Flex - PullRequest
3 голосов
/ 20 октября 2008

Есть ли способ временно заменить основное приложение Flex другим, а затем переключиться обратно. Сценарий: Основное приложение запущено, отобразите окно входа в систему - затем продолжите работу с основным приложением. Окно входа также является приложением.

Application.application - свойство только для чтения, попытка не удалась.

Ответы [ 4 ]

2 голосов
/ 21 октября 2008

Я добился большого успеха с модульным приложением, в котором основное приложение в основном состоит из загрузчика модулей, который изначально загружает модуль входа в систему.

Как только модуль входа в систему выполняет свои функции (в моем случае проверенные входные данные, называемые службой входа в систему и извлекают токен), он отправляет событие (образно называемое «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>

Следует также отметить, что это приложение-обертка на самом деле не является приложением! На самом деле это сам модуль, который загружается приложением Flex или AIR. Таким образом, у меня могут быть отдельные проекты Flex и AIR, которые ссылаются на основной библиотечный проект, который содержит модуль приложения, модуль входа в систему, основной модуль (после входа в систему) и в основном все остальные компоненты и классы, используемые приложением.

1 голос
/ 20 октября 2008

Есть ли причина, по которой вы не можете сделать поле входа компонентом, а затем, возможно, использовать ViewStack для управления видимыми компонентами?

0 голосов
/ 21 октября 2008

Я реализовал это как ViewStack для компонента Application; Кажется, работает нормально. Используйте свойство selectedIndex или selectedChild в ViewStack, чтобы управлять отображением имени входа или пользовательского интерфейса приложения.

<mx:Application>
  <mx:ViewStack>
    <mx:Box> <!-- or whatever for login-->
    </mx:Box>
    <mx:Box> <!-- application UI widgets here -->
    </mx:Box>
  </mx:ViewStack>
</mx:Application>
0 голосов
/ 20 октября 2008

Забавно, это именно то, что я пытаюсь выяснить, лучший способ сделать на данный момент. Я думал об использовании ViewStack, но, поскольку у меня уже есть много других вложенных ViewStack, я также искал тег State. Если кто-нибудь знает, «как поступить правильно», мне тоже будет очень интересно!

...