2008-11-19 5 views
8

J'ai une fonction d'étiquette comme:Comment puis-je créer un labelFunction réutilisable pour Flex Datagrid?

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

que j'utilise dans un DataColumn en utilisant labelFunction.

Cela fonctionne très bien si mon champ de données est appelé 'startDate'. Je veux rendre cette fonction générique afin que je puisse 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 tout à fait?

Répondre

11

Vous pouvez définir une autre fonction, appelons-le partial qui lie certains 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 ceci:

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 remplacé toutes les références à "startDate" avec cet argument.

Et l'utiliser comme ceci:

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

La fonction retourne partial une nouvelle fonction qui appelle la fonction originale avec les paramètres de l'appel à concaténés partielle avec les paramètres de la nouvelle fonction ... vous avec moi? Une autre façon de le dire est qu'il peut retourner une nouvelle fonction où N des arguments sont pré-liés à des valeurs spécifiques.

Parcourons étape par étape:

partial(formatDate, "startDate") retourne une fonction qui ressemble à ceci:

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

mais le func et boundArgs sont ce que vous avez passé comme arguments à partial, donc on peut dire cela ressemble à ceci:

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

qui, quand il est appelé, sera plus ou moins le identique à celui-ci

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

Tada!

14

Vous pouvez rendre la fonction générique en utilisant l'attribut dataField de la colonne comme clé dans votre article.

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

+1

Cela devrait vraiment être la réponse. Et vous pouvez même le rendre 'public static' dans une classe util (par exemple' GridUtils') et l'utiliser partout dans votre application (par exemple 'labelFunction =" GridUtils.formatDate "') –

+0

Ceci est une bonne réponse. L'autre est plutôt compliqué. Sauf que je viens juste de retourner df.format (item [column.dataField]); – Fletch

0

ici est beaucoup 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 (DataGrid Spark)

var labelFunction = getDateLabelFunction(); 

ou MX Datagrid

var labelFunction = getDateLabelFunction(null,true); 

pour passer commande Format de date chaîne:

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

par défaut est "MM/JJ/AAAA";