обнаруживать изменения в элементах Flex Form (textinput, textarea, combobox, checkbox ..) - PullRequest
3 голосов
/ 19 января 2010

У меня есть различные (читай много ..) гибкие формы в моем приложении, и теперь я хочу создать систему, с помощью которой пользователь получает уведомление о том, что он не сохранил, если он изменяет что-либо в форме ...

сейчас .. Я не хочу переписывать все формы, которые у меня есть ... есть какой-нибудь хороший способ реализовать это?Как-нибудь расширить классы TextInput (и другие ...)?

спасибо

Ответы [ 2 ]

1 голос
/ 19 января 2010

Это не совсем продумано, но должно работать.

Вы можете создать пользовательский компонент, назовем его FormWatcher, который вы бы поместили рядом с вашей формой.Наблюдатель за формой будет ждать события CreationComplete из формы.

Итак, теперь, когда у нас есть готовая форма, вы можете использовать метод getChildren () формы, чтобы получить все FormItems.Затем загляните внутрь каждого из них, и вы получите TextInputs, Combobox и т. Д., К которым вы можете добавить прослушиватели событий (как отдельные компоненты), например.

        // 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

Просто вставьте этот код рядом с какой-либо формой,и вызовите startWatching (nameOfYourForm), вы должны увидеть, что вызывается changeHandler.

Еще несколько замечаний:

1) После завершения вы должны очистить прослушиватели событий.

2) Я бы создал из него компонент, чтобы вы могли использовать его следующим образом:

<mx:Form id="form1" >
[...]
</mx:Form>

<FormWatcher form="{form1}"  />

Где у FormWatcher будет логический переменный с именем «clean» или что-то в этом роде.

3) Пример очень прост, поэтому он будет работать только для форм, похожих на этот:

<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>
1 голос
/ 19 января 2010

Вы можете зайти в класс TextInput (и другие) и добавить этот прослушиватель и функцию события, но тогда вы измените сам SDK, что является плохой идеей. Я бы создал пользовательские классы, расширяющие те, которые вы используете, и сделал бы поиск / замену, чтобы сделать это быстрее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...