2009-06-12 9 views
1

J'ai un objet liste et j'y ajoute des éléments avec addItem via le dataProvider.Accès à un fournisseur de données avec indexOf

Avant d'ajouter un article à la liste, je veux m'assurer qu'il ne s'agit pas d'un doublon. J'ai essayé d'utiliser indexOf sur le dataProvider et il renvoie null. J'ai essayé de le convertir en un tableau et cela fonctionne, mais retourne toujours -1 même si l'élément existe dans le fournisseur de données.

La seule méthode que je suis en mesure d'utiliser semble un peu hacky et je voudrais savoir s'il y a une meilleure façon de trouver un élément dans un 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> 

Répondre

4

Même si vous nourrissez un tableau dans la propriété dataProvider, le fournisseur de données sous-jacente est toujours de type ArrayCollection et NON Array. Il prend en charge les tableaux en entrée, mais les convertit en ArrayCollection en utilisant le constructeur:

ArrayCollection(source:Array) 

Vous pouvez utiliser la méthode suivante:

ArrayCollection.contains(item:Object):Boolean 

pour vous assurer de ne pas ajoutez un élément en double.

+0

Merci. Cela a fonctionné parfait! J'ai utilisé la méthode contains sur le dataProvider et il agit exactement comme je le veux. – metric152

+0

content je pourrais aider! –

0

Si vous voulez la liste pour changer avec une modification des données sous-jacentes, vous devez utiliser un ArrayCollection au lieu de Array.

Et il semble que votre problème utilise la fonction toString(). Il devrait être:

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

Lorsque vous faites dataProvider.toString(), vous convertissez le tableau en une chaîne, puis vous recherchez la chaîne.

En outre, des tableaux n'ont pas une fonction addItem(), vous devez utiliser push() à la place. addItem est pour ArrayCollections.

+0

Votre variable "arr" sera toujours nulle. Voir julotlafrite pour la raison. –

0

Vous pouvez toujours utiliser un tableau, mais il ne sera pas dynamique avec un ArrayCollection ...

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

vous suffit d'appeler si vous ajoutez des données après la création du contrôle de liste.

Questions connexes