最近公司要求做一个打开指定节点的功能,实现类似自动选择的效果。钻研了若干小时,死了N个脑细胞终于成功,现在贴出来与大家共享之。
源码:
[Bindable]
private var rootXml:XML;
//获取树
private function getDirectoryTreeHandler(event:ResultEvent):void{
rootXml = new XML(event.result);
templateTree.dataProvider = rootXml;
templateTree.validateNow();
var tTimer:Timer=new Timer(50,1);
TWindow.visible=true;
tTimer.addEventListener(TimerEvent.TIMER, selectItem);
tTimer.start();
}
//根据提供的节点展开节点和parent节点
private function expandParents(node:XML):void {
if (node && !templateTree.isItemOpen(node)) {
templateTree.expandItem(node, true);
expandParents(node.parent());
}
}
//展开,按id选择模板
private function selectItem(event:TimerEvent):void
{
if(rootXml != null)
{
if(null != selectedTemplate)
{
item = rootXml..*.(hasOwnProperty("@docId")&&@docId==selectedTemplate.docId)[0]; //按docId选择节点
if(item == null)
{
CocoaAlert.show("工作项关联模板文档失败!", "提示", null, true,AlertType.FORBID);
}
else
{
//展开tree
expandParents((item as XML));//具体展开的代码
templateTree.selectedItem = item;
selectedItem = item as XML;
templateVS.selectedIndex=1;
}
}
}
}
........
<mx:Tree id="templateTree" width="100%" height="100%" labelFunction="labelFunc" iconFunction="iconFun" change="treeChanged(event);"
showRoot="false" dataProvider="{rootXml}" doubleClickEnabled="true" itemDoubleClick="doubleClickTree(event);"/>
注意:
1.根据api的提示:“如果设置 dataProvider
之后立即调用 expandItem()
,则您可能看不到正确的行为。您应该等待对组件进行验证或调用 validateNow()
。 ”所以在设置了dataProvider后就使用了templateTree.validateNow();进行验证。
2.rootXml..*.(hasOwnProperty("@docId")&&@docId==selectedTemplate.docId)[0]; 用于搜索拥有某个属性的xml节点,但是rootXml..*.这段就不解其意(也是网上搜到的,嘿嘿),请各位达人见教啊,谢谢了。