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?

È stato utile?

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top