2008-11-19 6 views
8

que tienen una función de sello como:¿Cómo puedo crear una función de etiqueta reutilizable para Flex Datagrid?

private function formatDate (item:Object, column:DataGridColumn):String 
{ 
    var df:DateFormatter = new DateFormatter(); 
    df.formatString = "MM/DD/YY"; 

    if (column.dataField == "startDate") { 
     return df.format(item.startDate); 
    } 

    return "ERR"; 
} 

que utilizo en un DataColumn utilizando labelFunction.

Esto funciona bien si mi campo de datos se llama 'startDate'. Quiero hacer que esta función sea genérica para poder usarla en todos lados.

¿Cómo puedo hacer esto. Creo que necesito usar algún tipo de 'reflexión' - ¿o tal vez otro enfoque en total?

Respuesta

11

Puede definir otra función, vamos a llamarlo partial que une a algunos argumentos adicionales a su función:

function partial(func : Function, ...boundArgs) : Function { 
    return function(...dynamicArgs) : * { 
    return func.apply(null, boundArgs.concat(dynamicArgs)) 
    } 
} 

A continuación, cambiar su función como esta:

private function formatDate(dataField : String, item : Object, column : DataGridColumn) : String { 
    var df : DateFormatter = new DateFormatter(); 

    df.formatString = "MM/DD/YY"; 

    if (column.dataField == dataField) { 
    return df.format(item[dataField]); 
    } 

    return "ERR"; 
} 

Tenga en cuenta que he añadido un nuevo argumento llamado dataField primero en la lista de argumentos, y reemplazó todas las referencias a "startDate" con ese argumento.

y utilizarlo como esto:

var startDateLabelFunction : Function = partial(formatDate, "startDate"); 
var endDateLabelFunction : Function = partial(formatDate, "endDate"); 

La función partial devuelve una nueva función que llama a la función original con los parámetros de la llamada a concatenados parcial con los parámetros a la nueva función ... que con ¿yo? Otra forma de decirlo es que puede devolver una nueva función donde N de los argumentos están predefinidos a valores específicos.

Vamos a través de él paso a paso:

partial(formatDate, "startDate") devuelve una función que tiene este aspecto:

function(...dynamicArgs) : * { 
    return func.apply(null, boundArgs.concat(dynamicArgs)); 
} 

pero el func y boundArgs son lo que pasa como argumentos para partial, por lo que se podría decir que se ve así:

function(...dynamicArgs) : * { 
    return formatDate.apply(null, ["startDate"].concat(dynamicArgs)); 
} 

que, cuando se llame, será más o menos el igual que este

function(item : Object, column : DataGridColumn) : * { 
    return formatDate("startDate", item, column); 
} 

Tada!

14

Puede hacer que la función sea genérica utilizando el atributo de campo de datos de la columna como la clave de su elemento.

private function formatDate (item:Object, column:DataGridColumn):String 
{ 
    var df:DateFormatter = new DateFormatter(); 
    df.formatString = "MM/DD/YY"; 

    var value:object = item[column.dataField]; 

    return df.format(value); 
} 

-Ben

+1

Esto realmente debería ser la respuesta. E incluso puede convertirlo 'public static' en una clase util (por ejemplo,' GridUtils') y usarlo en toda la aplicación (por ejemplo 'labelFunction =" GridUtils.formatDate "') –

+0

Esta es una buena respuesta. El otro es bastante complicado. Excepto que acabo de devolver df.format (item [column.dataField]); – Fletch

0

aquí es la manera más genérica:

public static function getDateLabelFunction(dateFormatString:String=null, mxFunction:Boolean = false) : Function { 
     var retf:Function; 

     // defaults 
     if(dateFormatString == null) dateFormatString = "MM/DD/YY"; 
     if(mxFunction) { 
      retf = function (item:Object, column:DataGridColumn):String 
      { 
       var df:DateFormatter = new DateFormatter(); 
       df.formatString = dateFormatString; 

       var value:Object = item[column.dataField]; 

       return df.format(value); 
      } 
     }else { 
      retf = function (item:Object, column:GridColumn):String 
      { 
       var df:DateFormatter = new DateFormatter(); 
       df.formatString = dateFormatString; 

       var value:Object = item[column.dataField]; 

       return df.format(new Date(value)); 
      } 
     } 

     return retf; 

    } 

Uso (DataGrid Spark)

var labelFunction = getDateLabelFunction(); 

o para MX Datagrid

var labelFunction = getDateLabelFunction(null,true); 

para pasar a medida Fecha Cadena de formato:

var labelFunction = getDateLabelFunction("DD/MM/YYYY",true); 

por defecto es un "MM/DD/AAAA";

Cuestiones relacionadas