2010-01-19 50 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本身,這是怎樣的一個壞主意。我會創建自定義的類來擴展你使用的類並做一個查找/替換以使其更快。