flex - emplea - ejemplo de atributo alt html
¿Cómo puedo hacer una función de etiqueta reutilizable para Flex Datagrid? (3)
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 utilizo en una columna de datos mediante el uso de 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?
Puede definir otra función, llamémosla partial
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 cambias tu 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 ... ¿usted conmigo? 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 ir paso a paso:
partial(formatDate, "startDate")
devuelve una función que se ve así:
function( ...dynamicArgs ) : * {
return func.apply(null, boundArgs.concat(dynamicArgs));
}
pero el func
y boundArgs
son lo que boundArgs
como argumentos a partial
, por lo que podrías decir que se ve así:
function( ...dynamicArgs ) : * {
return formatDate.apply(null, ["startDate"].concat(dynamicArgs));
}
que, cuando se llame, será más o menos lo mismo que este
function( item : Object, column : DataGridColumn ) : * {
return formatDate("startDate", item, column);
}
Tada!
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
aquí hay una 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 (Spark DataGrid)
var labelFunction = getDateLabelFunction();
o para MX Datagrid
var labelFunction = getDateLabelFunction(null,true);
pasar una cadena de formato de fecha personalizada:
var labelFunction = getDateLabelFunction("DD/MM/YYYY",true);
El valor predeterminado es "MM / DD / YYYY";