代码之家  ›  专栏  ›  技术社区  ›  luca

检测flex表单元素(textInput、textArea、comboBox、checkbox….)中的更改。

  •  3
  • luca  · 技术社区  · 16 年前

    我的应用程序中有各种各样的(阅读了很多…)flex表单,现在我想创建一个系统,通过这个系统,如果用户修改表单中的任何内容,他将被通知他没有保存。

    现在。。我不想重写我所有的表格……有什么好的方法来实现这个吗? 以某种方式扩展textfinput(和其他..)类?

    谢谢

    2 回复  |  直到 16 年前
        1
  •  1
  •   Robert Bak    16 年前

    这并不是经过深思熟虑,但应该奏效。

    您可以创建一个自定义组件,让我们称之为FormWatcher,而不是将其放在表单旁边。表单观察者要做的是等待表单中的CreationComplete事件。

    现在,由于我们已经准备好了表单,您可以使用表单的getchildren()方法来获取其中的所有表单项。然后查看每个事件监听器,您将得到文本输入、组合框等,您可以向其中添加事件监听器(作为单个组件),例如。

            // 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(表单的名称),就可以看到正在调用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>
    
        2
  •  1
  •   invertedSpear    16 年前

    您可以进入textinput类(和其他类)并添加事件侦听器和函数,但随后您将更改sdk本身,这是一个坏主意。我将创建自定义类来扩展您使用的类,并执行查找/替换以使其更快。