Я не думаю, что проблема заключается в сортировке сгруппированных данных с нулевыми или пустыми строковыми значениями (которые являются абсолютно допустимыми значениями);
В документах четко указано, что свойство, представленное dataField
, должно быть допустимым свойством в dataProvider [item], то есть оно должно существовать, быть нулевым или нет.
Хотя я и отдаю свой голос RaySir, я не совсем согласен с тем, что это хак, а скорее вы нормализуете свои данные, что, на мой взгляд, является идеальным вариантом для уровня представления.
Вот переработанный пример:
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
layout="vertical"
verticalAlign="middle"
backgroundColor="white" >
<mx:Script>
<![CDATA[
import mx.collections.HierarchicalData;
import mx.controls.advancedDataGridClasses.AdvancedDataGridColumn;
import mx.utils.ObjectUtil;
private var arrData : Array = [
{ name: "User A", dob: "04/14/1980" },
{ name: "User B", dob: "01/02/1975" },
{ name: "Group A", dob: null, children: [
{ name: "User E", dob: "09/13/1972" },
{ name: "User F", dob: "11/22/1993" }
]
},
{ name: "Group B", dob: null, children: [
{ name: "Group B1", dob: null, children: [
{ name: "User I", dob: "01/23/1984" },
{ name: "User J", dob: "11/10/1948" }
]
},
{ name: "User G", dob: "04/09/1989" },
{ name: "User H", dob: "06/20/1963" }
]
},
{ name: "User C", dob: "12/30/1977" },
{ name: "User D", dob: "10/27/1968" }
];
private function dob_sort(itemA:Object, itemB:Object):int {
var dateA:Date = itemA.dob ? new Date(itemA.dob) : null;
var dateB:Date = itemB.dob ? new Date(itemB.dob) : null;
return ObjectUtil.dateCompare(dateA, dateB);
}
private function dob_dataTip(item:Object):String {
if (!item.hasOwnProperty('children') && item.hasOwnProperty("dob")) {
return dateFormatter.format(item.dob);
}
return null;
}
private function dob_label(item:Object, col:AdvancedDataGridColumn):String {
if(!item.hasOwnProperty('children') && item.hasOwnProperty("dob")) {
return item.dob;
}
return null;
}
]]>
</mx:Script>
<mx:DateFormatter id="dateFormatter" formatString="MMMM D, YYYY" />
<mx:AdvancedDataGrid id="adgTest" dataProvider="{new HierarchicalData(arrData)}" designViewDataType="tree" width="746" height="400">
<mx:columns>
<mx:AdvancedDataGridColumn headerText="Name" dataField="name"/>
<mx:AdvancedDataGridColumn headerText="Date of birth" dataField="dob"
labelFunction="dob_label"
dataTipFunction="dob_dataTip"
sortCompareFunction="dob_sort"
showDataTips="true" />
</mx:columns>
</mx:AdvancedDataGrid>
</mx:Application>