Restfulx導入記 -その4 Tree編-

前回に引き続き,UnitというmodelのTree表示を行いたいと思います.

実は,Tree表示は結構面倒だったりします.
Rx.models.indexはModelsCollectionを返します.
ModelsCollection < RxCollection < mx.collections.ArrayCollection
な感じで,ArrayCollectionを継承したClassです.

つまり,Unit.find(:all) → Rx.models.index(Unit):ModelsCollectionとなるわけですね.
で,ArrayCollectionはDataGrid, AdvancedDataGrid, ListなどとのDataProviderとしては良いのですが,
TreeなどはXMLListCollectionをDataProviderで与えなければなりません.
ちなみに,XMLListCollectionは XMLListCollection < XMLList(複数のrootノードがあるXML) < XML
になります.

話がそれましたが,何が面倒かというと,
TreeにDataを渡すには,ArrayCollectionからXMLListやXMLListCollectionなど,Treeに適したDataに変換しなくてはなりません.
仕方がないので,変換する関数を書きました.
再起的にArrayを構成していきます.

private function onUnitSelect():void {
_unit = RxUtils.clone(unitsList.selectedItem.data) as Unit;
}


import org.restfulx.collections.ModelsCollection;
private function convertTree(units:ModelsCollection):Array{
var array:Array = new Array();
for each(var item:Unit in units){
if(item.parent==null){
array.push(getChild(item));
}
}
return array;
}

private function getChild(item:Unit):Object{
if(item.children==null){
return {label:item.name,data:item};
}else{
var children:Array = new Array();
for each(var c:Unit in item.children){
children.push(getChild(c));
}
return {label:item.name,data:item,children:children};
}
}

  • (中略)-



な感じです.
これで,事件は解決です.