Comment puis-je créer un labelFunction réutilisable pour Flex Datagrid?
-
08-07-2019 - |
Question
J'ai une fonction d'étiquette du type:
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";
}
Ce que j'utilise dans une colonne de données en utilisant labelFunction
.
Cela fonctionne très bien si mon champ de données s'appelle 'startDate'. Je veux rendre cette fonction générique afin de pouvoir l'utiliser partout.
Comment puis-je faire cela? Je pense que je dois utiliser une sorte de "réflexion" - ou peut-être une autre approche? "
La solution
Vous pouvez définir une autre fonction, appelons-la partial
qui lie des arguments supplémentaires à votre fonction:
function partial( func : Function, ...boundArgs ) : Function {
return function( ...dynamicArgs ) : * {
return func.apply(null, boundArgs.concat(dynamicArgs))
}
}
Ensuite, vous changez votre fonction comme suit:
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";
}
Notez que j'ai ajouté un nouvel argument appelé dataField
en premier dans la liste des arguments et que j'ai remplacé toutes les références à " startDate " avec cet argument.
Et utilisez-le comme ceci:
var startDateLabelFunction : Function = partial(formatDate, "startDate");
var endDateLabelFunction : Function = partial(formatDate, "endDate");
La fonction partial
renvoie une nouvelle fonction qui appelle la fonction d'origine avec les paramètres de l'appel à partial concaténés avec les paramètres de la nouvelle fonction ... vous avec moi? Une autre façon de le dire est qu'il peut renvoyer une nouvelle fonction où N des arguments sont déjà liés à des valeurs spécifiques.
Passons en revue étape par étape:
partial (formatDate, "startDate")
renvoie une fonction qui ressemble à ceci:
function( ...dynamicArgs ) : * {
return func.apply(null, boundArgs.concat(dynamicArgs));
}
mais les func
et boundArgs
sont ce que vous avez transmis comme arguments à partial
, de sorte que vous pourriez dire que cela ressemble à ceci:
function( ...dynamicArgs ) : * {
return formatDate.apply(null, ["startDate"].concat(dynamicArgs));
}
qui, quand il sera appelé, sera plus ou moins le même que celui-ci
function( item : Object, column : DataGridColumn ) : * {
return formatDate("startDate", item, column);
}
Tada!
Autres conseils
Vous pouvez rendre la fonction générique à l'aide de l'attribut dataField de la colonne en tant que clé de votre élément.
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
voici une manière plus générique:
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;
}
Utilisation (Spark DataGrid)
var labelFunction = getDateLabelFunction();
ou pour la grille de données MX
var labelFunction = getDateLabelFunction(null,true);
pour passer la chaîne de format de date personnalisée:
var labelFunction = getDateLabelFunction("DD/MM/YYYY",true);
La valeur par défaut est "MM / JJ / AAAA";