检测Flex Form元素的变化(textinput,textarea,combobox,checkbox ..)

时间:2010-01-19 18:25:49

标签: flex actionscript-3 events actionscript flex3

我在我的应用程序中有各种(阅读很多..)flex表单,我现在想要创建一个系统,通过该系统,如果用户修改了表单中的任何内容,则通知用户他没有保存... < / p>

现在..我不想重写我拥有的每一个表格..有没有一些很好的方法来实现它? 以某种方式扩展TextInput(和其他..)类?

感谢

2 个答案:

答案 0 :(得分:1)

你可以进入TextInput类(和其他人)并添加该事件监听器和函数,但是你会改变SDK本身,这是一个坏主意。我会创建自定义类来扩展您使用的类,并进行查找/替换以使其更快。

答案 1 :(得分:1)

这不是经过深思熟虑但应该有用。

您可以创建一个自定义组件,让我们将其称为FormWatcher,您可以将其放在表单旁边。表单监视器将执行的操作是等待表单中的CreationComplete事件。

现在,因为我们已准备好Form,您可以使用表单的getChildren()方法来获取其中的所有FormItem。然后查看每个内部,你将获得TextInputs,Comboboxes等,你可以添加事件监听器(作为单独的组件),例如。

        // 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”的布尔值var。

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>