Come posso creare un'etichetta riutilizzabile Funzione per Flex Datagrid?
-
08-07-2019 - |
Domanda
Ho una funzione etichetta come:
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";
}
Che uso in una colonna di dati usando labelFunction
.
Funziona bene se il mio campo dati si chiama 'startDate'. Voglio rendere generica questa funzione in modo da poterla utilizzare ovunque.
Come posso farlo. penso di dover usare una sorta di "riflessione" - o forse un altro approccio del tutto?
Soluzione
Puoi definire un'altra funzione, chiamiamola parziale
che lega alcuni argomenti extra alla tua funzione:
function partial( func : Function, ...boundArgs ) : Function {
return function( ...dynamicArgs ) : * {
return func.apply(null, boundArgs.concat(dynamicArgs))
}
}
Quindi cambi la tua funzione in questo modo:
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";
}
Nota che ho aggiunto un nuovo argomento chiamato dataField
prima nell'elenco degli argomenti e ho sostituito tutti i riferimenti a " startDate " con tale argomento.
E usalo in questo modo:
var startDateLabelFunction : Function = partial(formatDate, "startDate");
var endDateLabelFunction : Function = partial(formatDate, "endDate");
La funzione parziale
restituisce una nuova funzione che chiama la funzione originale con i parametri dalla chiamata a parziale concatenata con i parametri alla nuova funzione ... tu con me? Un altro modo per dirlo è che può restituire una nuova funzione in cui N degli argomenti è pre-associato a valori specifici.
Esaminiamo passo per passo:
partial (formatDate, " startDate ")
restituisce una funzione simile a questa:
function( ...dynamicArgs ) : * {
return func.apply(null, boundArgs.concat(dynamicArgs));
}
ma func
e boundArgs
sono quelli che hai passato come argomenti a partial
, quindi potresti dire che assomiglia a questo:
function( ...dynamicArgs ) : * {
return formatDate.apply(null, ["startDate"].concat(dynamicArgs));
}
che, quando viene chiamato, sarà più o meno lo stesso di questo
function( item : Object, column : DataGridColumn ) : * {
return formatDate("startDate", item, column);
}
Tada!
Altri suggerimenti
Puoi rendere generica la funzione usando l'attributo dataField della colonna come chiave nel tuo oggetto.
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
qui è un modo più generico:
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;
}
Utilizzo (Spark DataGrid)
var labelFunction = getDateLabelFunction();
o per MX Datagrid
var labelFunction = getDateLabelFunction(null,true);
per passare una stringa di formato data personalizzata:
var labelFunction = getDateLabelFunction("DD/MM/YYYY",true);
L'impostazione predefinita è " MM / GG / AAAA " ;;