2010-01-19 47 views
3

我在我的应用程序中有各种各样的(阅读大量..)flex表单,现在我想创建一个系统,通过这个系统通知用户他没有保存,如果他修改任何形式的东西...检测Flex表单元素(textinput,textarea,combobox,复选框..)的变化

现在..我不想重写每一个形式,我有..是否有一些不错的方式来实现这一点? 以某种方式扩展TextInput(和其他..)类?

感谢

回答

1

这不是真的想通过,但应该工作。

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

所以,现在,我们已经准备好了Form,您可以使用表单的getChildren()方法来获取其中的所有FormItems。比他们每个人看,你会得到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将有一个布尔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> 
1

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