Pregunta

Tengo una función de etiqueta como:

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 uso en una columna de datos usando labelFunction .

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

¿Cómo puedo hacer esto? Creo que necesito usar algún tipo de 'reflexión', ¿o tal vez otro enfoque por completo?

¿Fue útil?

Solución

Puede definir otra función, llamémosla parcial que une algunos argumentos adicionales a su función:

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

Luego cambia su función de esta manera:

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";
}

Observe que agregué un nuevo argumento llamado dataField primero en la lista de argumentos, y reemplacé todas las referencias a " startDate " con ese argumento.

Y úsalo así:

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 parcial concatenada con los parámetros a la nueva función ... ¿estás conmigo? Otra forma de decirlo es que puede devolver una nueva función donde N de los argumentos están vinculados previamente a valores específicos.

Veamos paso a paso:

partial (formatDate, " startDate ") devuelve una función que se ve así:

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

pero func y boundArgs son lo que pasó como argumentos a parcial , por lo que podría decir que se ve así:

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

que, cuando se llama, será más o menos igual que esto

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

¡Tada!

Otros consejos

Puede hacer que la función sea genérica utilizando el atributo dataField de la columna como clave en 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

aquí hay una forma 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 (Spark DataGrid)

var labelFunction = getDateLabelFunction();

o para MX Datagrid

var labelFunction = getDateLabelFunction(null,true);

para pasar una cadena de formato de fecha personalizada:

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

El valor predeterminado es "MM / DD / AAAA";

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top