在adobe flex中可以使用什么代替tree.dataProvider?

时间:2017-03-06 09:31:49

标签: flex flex4

我的.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然后这个代码不起作用,有人可以告诉我为什么吗?

2 个答案:

答案 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);

我在您的代码中尝试了这一点,它似乎与上面的代码完成相同的工作。

您可以在此处详细了解:

http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/mx/collections/XMLListCollection.html#source

希望这个解释有效并且它总体上回答了你的问题。

干杯。