2009-06-12 36 views
1

我有一個列表對象,並通過dataProvider通過addItem向它添加項目。使用indexOf訪問數據提供程序

在將項目添加到列表之前,我想確保它不是重複的。我試過在dataProvider上使用indexOf,它返回null。我已經嘗試將它轉換爲數組並且它可以工作,但即使dataProvider中存在該元素,也總是返回-1。

我已經能夠使用的唯一方法似乎有點hacky,我想知道是否有更好的方法來找到dataProvider中的元素。

<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" styleName="plain" applicationComplete="init()"> 
    <mx:Script> 
     <![CDATA[ 
      import mx.controls.List; 
      [Bindable] 
      public var testListArray:Array; 


      public function init():void 
      { 
       testList.dataProvider.addItem('test'); 
       testList.dataProvider.addItem('banana'); 

       //search for element in dataProvider 
       if(testList.dataProvider.toString().indexOf('banana') > -1) 
       { 
        trace('found'); 
       } 

       //search for element in dataProvider 
       if(testList.dataProvider.toString().indexOf('goat') === -1) 
       { 
        trace('not found'); 
       } 
      } 
     ]]> 
    </mx:Script> 
    <mx:List dataProvider="{testListArray}" x="260" y="204" id="testList" borderStyle="solid" borderColor="#000000"></mx:List> 
</mx:Application> 

回答

4

即使您正在將數組提供給dataProvider屬性,底層dataProvider始終爲ArrayCollection類型,而不是Array。它支持數組作爲輸入,但將它們轉換使用構造函數的ArrayCollection:

ArrayCollection(source:Array) 

您可以使用下面的方法:

ArrayCollection.contains(item:Object):Boolean 

,以確保您沒有添加重複的項目。

+0

謝謝。這工作完美!我在dataProvider上使用了contains方法,它只是我想要的方式。 – metric152 2009-06-16 19:42:07

0

如果您希望列表隨基礎數據的更改一起更改,則需要使用ArrayCollection而不是Array。

看來你的問題是使用toString()函數。它應該是:

var arr:Array = testList.dataProvider as Array; 
if(arr) 
{ 
    if(arr.indexOf("banana") > -1) 
     trace("found"); 
} 

當您執行dataProvider.toString()時,將數組轉換爲字符串,然後搜索字符串。

此外,數組沒有addItem()函數,您需要使用push()來代替。 addItem用於ArrayCollections。

+0

您的變量「arr」將始終爲空。看到j​​ulotlafrite的原因。 – 2009-06-16 10:45:52

0

你仍然可以使用數組,但它不會是動態的,與一個ArrayCollection ...

public function addToArray(item:String):void { 
    if (testListArray.indexOf(item) < 0){ 
     testListArray.push(item); 
     testList.dataProvider = testListArray; 
    } 
} 

你只需要調用這個,如果你創建的列表控件後,添加數據。

相關問題