una - detectar el cambio en los elementos del Formulario Flex(cuadro de texto, cuadro de texto, cuadro combinado, casilla de verificación...)
qué pasaría si todos los datos se pusieran en una lista con líneas para responder sin recuadros (2)
Tengo varios (lea muchos) ... formularios flexibles en mi aplicación, y ahora quiero crear un sistema por el cual se notifique al usuario que no ha guardado si modifica algo en el formulario ...
ahora ... No quiero volver a escribir cada formulario que tengo ... ¿hay alguna buena manera de implementar esto? Extendiendo las clases TextInput (y otras ...) de alguna manera?
Gracias
Esto realmente no está pensado, pero debería funcionar.
Podría crear un componente personalizado, llamémoslo FormWatcher, que luego colocaría junto a su Formulario. Lo que el observador de formularios haría es esperar al evento CreationComplete desde el formulario.
Entonces, ahora que tenemos listo el Formulario, puede usar el método getChildren () del formulario para obtener todos los FormItems. Luego mire dentro de cada uno de ellos, y obtendrá TextInputs, Comboboxes, etc. a los que puede agregar oyentes de eventos (como componentes individuales), por ej.
// THIS IS WHERE THE COMPONENT SHOULD START
protected function changeHandler(event:Event):void
{
trace ("something is dirty");
}
protected function startWatching(passTheFormHere:Form):void
{
for each (var O:Object in passTheFormHere.getChildren())
{
if (O is FormItem)
{
// Let''s assume you only have a single child in one FormItem
// and always one child for simplicity
addChangeHandlerFor((O as FormItem).getChildAt(0));
}
}
}
protected function addChangeHandlerFor(someComponent:Object):void
{
// Most regular flex components send a Event.CHANGE event
// when their value is changing
// keep in mind you should check stuff, this is a simple example
(someComponent).addEventListener(Event.CHANGE,changeHandler);
}
// THIS IS WHERE THE COMPONENT SHOULD END
Simplemente pegue este código al lado de algún formulario, y llame a startWatching (nameOfYourForm), debería ver que changeHandler se está llamando.
Algunas notas más:
1) Deberías limpiar los oyentes del evento una vez que hayas terminado.
2) Crearía un componente a partir de él para que lo usara así:
<mx:Form id="form1" >
[...]
</mx:Form>
<FormWatcher form="{form1}" />
Donde FormWatcher tendría una var booleana llamada "limpia" o algo así.
3) El ejemplo es muy simple, por lo que solo funcionará para formularios similares a este:
<mx:Form id="myForm" >
<mx:FormItem>
<mx:TextInput id="someComponent1" />
</mx:FormItem>
<mx:FormItem>
<mx:CheckBox id="someComponent2" />
</mx:FormItem>
<mx:FormItem>
<mx:TextArea id="someComponent3" />
</mx:FormItem>
</mx:Form>
Podrías ir a la clase TextInput (y a otros) y agregar ese detector y función de evento, pero luego estarías cambiando el SDK, lo cual es una especie de mala idea. Crearía clases personalizadas que ampliarían las que usaba y haría una búsqueda / reemplazo para hacerlo más rápido.