Je sais pas si ça vous parle le terme 'attribut imbriqué', mais c'est le terme que j'emploie pour désigner un attribut d'un attribut d'un attribut (etc) d'un objet. En d'autre terme si une classe 'Maison' contient l'attribut cuisine de type 'Cuisine', et que la classe 'Cuisine' contient un attribut four de type 'Four', alors on pourrait dire que four est un attribut imbriqué de cuisine.
Si vous faites partie des personnes intelligentes qui ont tout compris jusque là, sachez que les DataGrid peuvent prendre des noms d'attributs imbriqués dans les 'dataField' des colonnes. En gros on peut bien faire ça :
<mx:DataGridColumn labelFunction="dateFormatFunction"
dataField="cuisine.four"
headerText="Le four de la cuisine"/> |
Grâce à cette possibilité on a pas besoin du labelFunction juste pour accéder à l'attribut imbriqué dans la colonne.
Par contre si on veut utiliser 'labelFunction', on ne peut plus faire l'habituel item[column.dataField]. Sans oublier que les tris ne marchent plus puisqu'ils arrivent pas accéder à l'attribut du nom bizarre ('cuisine.four'). J'entends vos cris et vos regrets. Ne vous inquiétez pas, j'ai la solution qu'il vous faut!
J'ai créé d'abord une méthode dans la classe 'Utils.as' par exemple, qui extrait l'attribut imbriqué à partir de l'objet :
Utils.as
/**
*
Récupérer la valeur d'un impriqué à partir de l'objet et du nom de
*
l'attribut.
*/
public static function getValeurAttributImbrique(item:Object,nomAttributImbrique:String):Object
{
var nomAttributs:Array = nomAttributImbrique.split(".");
var currentItem:Object
= item;
for each (var attribut:String in nomAttributs) {
currentItem = currentItem[attribut]
}
return currentItem;
}
|
Ensuite je l'utilises dans les méthodes de création de label ('labelFunction') et de tri ('sortCompareFunction'). Je vous donne l'exemple d'un champ de type 'Date' :
Composant.mxml
<mx:DataGridColumn
dataField="dateDebutValidite"
labelFunction="Utils.formaterDateDefault"
sortCompareFunction="{Utils.dateSortCompareFunction('dateDebutValidite')}"
headerText="Date de début de validité"/>
|
Et d'ajouter à Utils.as les méthodes que je viens d'utiliser:
/**
* Formater la date en entrée sous la forme
la plus connue JJ/MM/AAAA
*/
public static function formaterDateDefault(item:Object,column:DataGridColumn):String
{
var
date:Object = Utils.getValeurAttributImbrique(item, column.dataField);
if(date){
if(date is Date){
return
formater(date as Date);
}
if(date is String){
return date as String;
}
}
return "";
}
/**
* @param date
* @format format de la date, par défault
"DD/MM/YYYY"
* @return La date au format passé en paramètre
*/
public static function formater(date:Date,
format:String = "DD/MM/YYYY"):String {
var
result:String = "";
var
dateFormater:DateFormatter = new DateFormatter();
dateFormater.formatString
= format;
result =
dateFormater.format(date);
return result;
}
/**
* Utile pour les propriété
'sortCompareFunction' des DataGridColumn
*/
public static function dateSortCompareFunction(field:String):Function {
return function (obj1:Object, obj2:Object):int {
var
date1:Date = Utils.getValeurAttributImbrique(obj1,field) as Date;
var
date2:Date = Utils.getValeurAttributImbrique(obj2,field) as Date;
return comparerDates(date1,date2);
}
}
public static function comparerDates(date1:Date,
date2:Date):int {
var
comparaison:int = ObjectUtil.dateCompare(date1, date2);
return comparaison;
}
|
Apluche.

Aucun commentaire:
Enregistrer un commentaire