定制IFactory展现DataGrid的列

 在使用flex中的DataGrid时,经常需要在DataGrid的某一类列中采用CheckBox或者Combox来展现数据,一般的是这样用的:

 

<mx:DataGridColumn headerText="Type" width="200" dataField="TransactionTypeID" editorDataField="value" textAlign="center" editable="true" rendererIsEditor="true">     <mx:itemRenderer>         <mx:Component>             <mx:ComboBox dataProvider="{myData}"/>         </mx:Component>     </mx:itemRenderer> </mx:DataGridColumn>

如果是在AS中写,那么按照官方给的说法应当是如下的:

 

                var grid:DataGrid = new DataGrid();                 var columns:Array = new Array();                 var column:DataGridColumn = new DataGridColumn;                 var factory:ClassFactory = new ClassFactory(ComboBox);                 factory.properties = {labelField:"name",dataProvider:myData}                 column.itemEditor = factory;                 columns.push(column);                grid.columns = columns;

但是这时候在使用factory.properties是不能把Combox的一些方法给添加进去的,比如我需要监听该Combox选项的变化,那么我必须给Combox注册一个事件监听的方法,但是,采用factory.properties的方法是不能实现的,于是我就想在factory上动手了

根据ClassFactory和column.itemEditor,可以知道只要实现了IFactory接口就可以了,于是利用AS的闭包特性,设计了IFactory的如下实现方式:

 

package test.test {     import mx.core.IFactory;          public class MyFactory implements IFactory     {         private var _fn:Function;         public function MyFactory(fn:Function)         {             this._fn = fn;         }                  public function newInstance():*         {             return _fn();         }     } }

在这种实现方式下,那么我们只要传递给MyFactory一个带有我们希望的返回值的方法就可以了,如下:

 

var factory:MyFactory = new MyFactory(createCombox);  private function createCombox():ComboBox{     var combox:ComboBox = new ComboBox();     combox.dataProvider = myData;     combox.labelField = "name";     combox.addEventListener(ListEvent.CHANGE,changeListener); }  private function changeListener(event:ListEvent):void{     //处理Combox选项改变事件 }

采用AS的闭包特性,我们完成了DataGrid中使用如Combox,CheckBox等其他空间的特殊需求


本人新博客地址

本文出自 “On_The_Way” 博客,转载请与作者联系!

你可能感兴趣的:(Flex,职场,休闲,IFactory)