我的.mxml如下:
<fx:Declarations>
<fx:XMLList id="data">
<node>
<node label="Inbox">
<node label="Marketing"/>
<node label="Product Management"/>
<node label="Personal"/>
</node>
<node label="Outbox">
<node label="Professional"/>
<node label="Private"/>
</node>
<node label="Spam">kushal</node>
<node label="Sent"/>
</node>
</fx:XMLList>
</fx:Declarations>
<mx:VBox>
<mx:Button label="Search by name" click="findByName()" />
<mx:Tree id="tree" width="500" height="500"
showRoot="false" dataProvider="{data}"
labelField="@label" />
</mx:VBox>
我试图点击按钮点击findByName(): 这是:
private function findByName():void
{
var mixml:XMLList = new XMLList(data);
var searchStr:String = "Outbox";
//child.expandChildrenOf(myXML[0], false);
//mixml=data;
searchResult= mixml.node.(@label==searchStr);
var xn:XML = searchResult[searchResultIndex];
Alert.show("xn"+ xn);
searchResultIndex = 0;
if (searchResult[searchResultIndex] != undefined)
var xmlNode:XML = searchResult[searchResultIndex];
while (xmlNode.parent() != null) {
Alert.show("xmlNodeBefore"+ xmlNode);
xmlNode = xmlNode.parent();
Alert.show("xmlNodeAfter"+ xmlNode);
//checkpoint 1
tree.expandItem(xmlNode, true, false);
tree.selectedItem = searchResult[searchResultIndex];
Alert.show(" tree.selectedItem " + tree.selectedItem );
}
}
如果在这里而不是数据 我使用tree.dataProvider然后这个代码不起作用,有人可以告诉我为什么吗?
答案 0 :(得分:0)
如果您查看Tree.dataProvider的setter,您可以看到它修改/转换了传入的值。
这行代码将转换为null,因为dataProvider将基于xml的数据更改为XmlListCollection。
var mixml:XMLList = new XMLList(data);
这是一个供参考的人。
override public function set dataProvider(value:Object):void
{
// in all cases save off the original
if (_rootModel)
_rootModel.removeEventListener(
CollectionEvent.COLLECTION_CHANGE,
collectionChangeHandler);
// handle strings and xml
if (typeof(value)=="string")
value = new XML(value);
else if (value is XMLNode)
value = new XML(XMLNode(value).toString());
else if (value is XMLList)
value = new XMLListCollection(value as XMLList);
if (value is XML)
{
_hasRoot = true;
var xl:XMLList = new XMLList();
xl += value;
_rootModel = new XMLListCollection(xl);
}
//if already a collection dont make new one
else if (value is ICollectionView)
{
_rootModel = ICollectionView(value);
if (_rootModel.length == 1)
_hasRoot = true;
}
else if (value is Array)
{
_rootModel = new ArrayCollection(value as Array);
}
//all other types get wrapped in an ArrayCollection
else if (value is Object)
{
_hasRoot = true;
// convert to an array containing this one item
var tmp:Array = [];
tmp.push(value);
_rootModel = new ArrayCollection(tmp);
}
else
{
_rootModel = new ArrayCollection();
}
//flag for processing in commitProps
dataProviderChanged = true;
invalidateProperties();
}
答案 1 :(得分:0)
使用tree.dataProvider
时,您的代码无效,因为它的类型为XMLListCollection
,它是XMLList
对象顶部的包装器。 Flex会在内部将XMLList
转换为XMLListCollection
,因为XMLListCollection
具有通过事件提供更改通知的功能,XMLList
没有。
因此,在您的代码中,如果您在以下行使用tree.dataProvider
:
var mixml:XMLList = new XMLList(tree.dataProvider);
您实际上是在尝试键入强制转换并将XMLListCollection
转换为XMLList,这就是它无效的原因。
有趣的是,XMLListCollection
具有公共属性(与Flex中的大多数集合一样),可用于访问由其组成的基础XMLList
源。因此,要从树中访问数据,一种正确的方法是:
var mixml:XMLList = new XMLList(tree.dataProvider.source);
我在您的代码中尝试了这一点,它似乎与上面的代码完成相同的工作。
您可以在此处详细了解:
希望这个解释有效并且它总体上回答了你的问题。
干杯。