ventana small modal example custom create crear flex air popup

small - Flex: Ventana emergente: obtener



ventana modal en ionic (3)

En forma:

var e:CloseEvent = new CloseEvent(CloseEvent.CLOSE); e.detail = okClicked ? Alert.OK : Alert.CANCEL; dispatchEvent(e);

En el padre:

var f:Form = new Form(); f.addEventListener(CloseEvent.CLOSE, onClose, false, 0, true); ... private function onClose(e:CloseEvent):void { if (e.detail == Alert.OK) // do something else if (e.detail == Alert.CANCEL) // do something else }

He hecho mucha programación C # con Winforms y WPF. Estoy trabajando en una aplicación Flex / Air ahora para soporte multiplataforma. Pero este es mi primer proyecto flexible, así que estoy aprendiendo sobre la marcha.

Tengo una ventana que quiero que aparezca, que el usuario completará un formulario, luego presione OK o CANCELAR. Lo configuré de la misma manera que lo hubiera hecho en C #, pero no funciona, y realmente no veo la manera de hacer que haga lo que quiero.

EDITAR: Así que estoy probando eventos ahora, los eventos simplemente no parecen ser manejados ...

EDITAR de nuevo: Oh, es porque el administrador emergente parece crear una nueva instancia del objeto Formulario, en lugar de usar el que ya creé.

entonces en el método showWindow, puse este código en lugar del administrador emergente:

parent.addChild(this);

luego lo elimino cuando lo cierre. El único problema es que no desactiva el resto del elemento primario como lo hace el administrador emergente. Alguna sugerencia sobre eso?

PADRE:

private function btnAdd_Clicked():void { var form:Form = new Form(); form.addEventListener(CloseEvent.CLOSE, onFormClosed, false, 0, true); recipeForm.showWindow(this); } private function onFormClosed(e:CloseEvent):void { //none of these Alerts are ever shown. I also tried breakpoints in debug to try an follow the code, with no luck Alert.show("Closed"); if(e.detail == Alert.OK) { Alert.show("OK"); } else if(e.detail == Alert.CANCEL) { Alert.show("Cancel"); } }

NIÑO:

private function btnCancel_Clicked():void { okClicked = false; closeWindow(); } public function closeWindow():void { var e:CloseEvent = new CloseEvent(CloseEvent.CLOSE); e.detail = okClicked ? Alert.OK : Alert.CANCEL; dispatchEvent(e); PopUpManager.removePopUp(this); } public function showWindow(parent:WindowedApplication):void { var window:IFlexDisplayObject = PopUpManager.createPopUp(parent, RecipeForm, true); PopUpManager.centerPopUp(window); }


No estoy seguro si esto sigue siendo un problema abierto. Me encontré con este mismo problema y creo que descubrí lo que está mal. Al menos lo hice por mi problema.

Implementé las cosas exactamente como lo hiciste. También tengo el atributo close establecido en closeWindow (estoy usando TitleWindow para mi diálogo).

Entonces, cuando la ventana se cierra a través de la X en la parte superior, se llamará a closeWindow, también si hace clic en el botón Cancelar, también llamará a closeWindow. El problema para mí fue que al hacer clic en cancelar, se distribuye un evento CloseEvent que parece captado por un Listener que llama a closeWindow nuevamente (posiblemente a través del atributo close que probablemente crea su propio oyente interno). No estoy seguro de si es un ciclo infinito, pero a Flex no le gusta esto.

Mi solución fue crear dos funciones, una para la ventana Cerrar de X para llamar y otra para el botón Cancelar para despachar un Evento Cerrar propio. Esto pareció funcionar para mí. Espero que te ayude


Puedes hacer esto al menos de dos maneras diferentes:

PRIMERA FORMA: Usar eventos

Deje que su clase de formulario envíe un evento cuando se haga clic en cualquiera de los botones. Después de crear una instancia de Formulario desde la vista principal, agregue un eventListener para los eventos que se sabe despachar. Cuando el formulario distribuye el evento, se invocará eventListener. Incluso puede volver a utilizar el CloseEvent de Flex y establecer la propiedad "detail" en Alert.OK o Alert.CANCEL antes de enviarlo.

En forma:

var e:CloseEvent = new CloseEvent(CloseEvent.CLOSE); e.detail = okClicked ? Alert.OK : Alert.CANCEL; dispatchEvent(e);

En el padre:

var f:Form = new Form(); f.addEventListener(CloseEvent.CLOSE, onClose, false, 0, true); ... private function onClose(e:CloseEvent):void { if (e.detail == Alert.OK) // do something else if (e.detail == Alert.CANCEL) // do something else }

SEGUNDA MANERA: Usar devoluciones de llamada

Agregue una var pública de tipo "Función" a su clase de Formulario y proporcione una función de devolución de llamada del padre. Esto básicamente hace lo mismo que # 1, excepto con un poco menos de abstracción / indirección.

Recomendaría el número 1 ya que el modelo de eventos en Flex está bastante bien concebido y es más flexible que la devolución de llamada.