Como posso fazer um labelFunction reutilizável para Flex DataGrid?
-
08-07-2019 - |
Pergunta
Eu tenho uma função rótulo 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";
}
O que eu uso em um DataColumn usando labelFunction
.
Isso funciona muito bem se o meu campo de dados é chamado de 'startDate'. Quero fazer esta função genérica para que eu possa usá-lo em todos os lugares.
Como posso fazer isso. Eu acho que preciso de usar algum tipo de 'reflexão' - ou talvez uma outra abordagem completamente
?Solução
Você pode definir outra função, vamos chamá-lo partial
que liga alguns argumentos extras para a sua função:
function partial( func : Function, ...boundArgs ) : Function {
return function( ...dynamicArgs ) : * {
return func.apply(null, boundArgs.concat(dynamicArgs))
}
}
Então você mudar a sua função 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";
}
Observe que eu adicionei um novo argumento chamado dataField
em primeiro lugar na lista de argumentos, e substituiu todas as referências a "startDate" com este argumento.
E usá-lo como este:
var startDateLabelFunction : Function = partial(formatDate, "startDate");
var endDateLabelFunction : Function = partial(formatDate, "endDate");
A função partial
retorna uma nova função que chama a função original com os parâmetros da chamada para parcial concatenados com os parâmetros para a nova função ... você comigo? Outra maneira de colocá-lo é que ele pode retornar uma nova função onde N dos argumentos são pré-ligados a valores específicos.
Vamos passar por isso passo a passo:
partial(formatDate, "startDate")
retorna uma função parecida com esta:
function( ...dynamicArgs ) : * {
return func.apply(null, boundArgs.concat(dynamicArgs));
}
mas o func
e boundArgs
são o que você passou como argumentos para partial
, então você poderia dizer que ele se parece com isso:
function( ...dynamicArgs ) : * {
return formatDate.apply(null, ["startDate"].concat(dynamicArgs));
}
que, quando é chamado, será mais ou menos o mesmo que este
function( item : Object, column : DataGridColumn ) : * {
return formatDate("startDate", item, column);
}
Tada!
Outras dicas
Você pode fazer a função genérica usando o atributo dataField da coluna como a chave em seu item.
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
aqui é a maneira mais 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 (faísca DataGrid)
var labelFunction = getDateLabelFunction();
ou para MX Datagrid
var labelFunction = getDateLabelFunction(null,true);
para passar personalizado seqüência de data Formato:
var labelFunction = getDateLabelFunction("DD/MM/YYYY",true);
O padrão é um "MM / DD / AAAA";