Wie kann ich eine wiederverwendbare labelfunction für Flex Datagrid machen?
-
08-07-2019 - |
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
?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";