Frage

Ich habe ein Label Funktion wie:

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

Was ich in einem Datacolumn verwenden, indem labelFunction verwendet wird.

Das funktioniert gut, wenn mein Datenfeld ‚startdate‘ genannt. Ich mag diese Funktion generisch machen, so kann ich es überall benutzen.

Wie kann ich dies tun. Ich glaube, ich brauche eine Art ‚Reflexion‘ verwenden - oder vielleicht einen anderen Ansatz insgesamt

?
War es hilfreich?

Lösung

Sie können eine andere Funktion definieren, machen wir es partial nennen, die einige zusätzliche Argumente an Ihre Funktion bindet:

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

Dann ändern Sie Ihre Funktion wie folgt aus:

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

Beachten Sie, dass ich ein neues Argument genannt dataField zuerst in der Argumentliste hinzugefügt haben, und ersetzt alle Verweise auf „startdate“ mit diesem Argument.

Und es wie folgt verwendet werden:

var startDateLabelFunction : Function = partial(formatDate, "startDate");
var endDateLabelFunction   : Function = partial(formatDate, "endDate");

Die partial Funktion gibt eine neue Funktion, die die ursprüngliche Funktion mit den Parametern aus dem Aufruf von Teil mit den Parametern der neuen Funktion ... Sie mit mir verketteten nennt? Eine andere Art, es auszudrücken ist, dass es eine neue Funktion, wobei N der Argumente zurückgeben kann auf bestimmte Werte vorge gebunden sind.

Gehen wir durch sie Schritt für Schritt:

partial(formatDate, "startDate") gibt eine Funktion, die wie folgt aussieht:

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

aber die func und boundArgs sind, was Sie als Argumente übergeben partial, so könnte man sagen, dass es wie folgt aussieht:

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

, die, wenn sie aufgerufen wird, wird die gleiche wie diese mehr oder weniger

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

Tada!

Andere Tipps

Sie können die Funktion generische machen die Datafield-Attribut der Spalte als Schlüssel in Ihrem Element verwendet wird.

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

hier ist allgemeinerer Art und Weise:

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;

    }

Usage (Spark-Datagrid)

var labelFunction = getDateLabelFunction();

oder für MX-Datagrid

var labelFunction = getDateLabelFunction(null,true);

benutzerdefiniertes Datumsformat String zu übergeben:

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

Der Standardwert ist eine "MM / DD / YYYY";

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top