2017-03-06 63 views
-1

我有我的.mxml如下:什麼可以用來代替adobe flex中的tree.dataProvider?

<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

感謝伴侶!正是我需要的。 – kushal

+0

很高興幫助!感謝您接受答案。有些我沒有收到賞金?你可以請獎嗎?謝謝 –

回答

0

您的代碼不起作用。 Flex內部將XMLList轉換爲XMLListCollection,因爲XMLListCollection具有通過事件提供更改通知的功能,而XMLList則不具備這一功能。

因此,在你的代碼,如果你在下面一行用tree.dataProvider

var mixml:XMLList = new XMLList(tree.dataProvider); 

你實際上是試圖強制類型轉換和轉換的XMLListCollection成的XMLList,這就是爲什麼它不工作。

有趣的是,XMLListCollection具有公共屬性(如Flex中的大多數集合),可用於訪問由其組成的源代碼。所以,從樹中訪問數據,一個正確的方法是:

var mixml:XMLList = new XMLList(tree.dataProvider.source); 

我已經在你的代碼嘗試這樣做,它似乎做同樣的工作作爲你上面的代碼。

你可以閱讀更多關於此這裏:

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

希望這樣的解釋工作,並全面回答你的問題。

乾杯。

0

如果您Tree.dataProvider檢查出的二傳手,你可以看到它修改/轉換是那些獲得在傳遞的值。

這行代碼將轉換爲null,因爲數據提供程序更改基於XML數據轉換成的XMLListCollection。

var mixml:XMLList = new XMLList(data); 

這裏是引用的setter。當您使用tree.dataProvider因爲它的類型XMLListCollection,這是對XMLList對象的一種包裝的

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(); 
} 
+0

所以你的答案是一種解決方法? – kushal

+0

對不起,我不是更清楚...數據得到的變成XMLListCollection我會編輯我的答案。 – Clintm

+0

那麼我用什麼來代替tree.dataProvider? – kushal

相關問題