Доступ к dataProvider с помощью indexOf - PullRequest
1 голос
/ 12 июня 2009

У меня есть объект списка, и я добавляю к нему элементы с помощью addItem через dataProvider.

Прежде чем добавить элемент в список, я хочу убедиться, что он не является дубликатом. Я попытался использовать indexOf для dataProvider, и он возвращает ноль. Я попытался привести его к массиву, и он работает, но всегда возвращает -1, даже если элемент существует в dataProvider.

Единственный способ, который я смог использовать, кажется немного хакерским, и я хотел бы знать, есть ли лучший способ найти элемент в 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>

Ответы [ 3 ]

4 голосов
/ 13 июня 2009

Даже если вы передаете массив в свойство dataProvider, базовый dataProvider всегда имеет тип ArrayCollection и NOT Array. Он поддерживает массивы в качестве входных данных, но преобразует их в ArrayCollection с помощью конструктора:

ArrayCollection(source:Array)

Вы можете использовать следующий метод:

ArrayCollection.contains(item:Object):Boolean 

, чтобы убедиться, что вы не добавляете дубликат элемента.

0 голосов
/ 13 июня 2009

Вы все еще можете использовать массив, но он не будет динамическим, как с коллекцией ArrayCollection ...

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

вам нужно будет вызывать это, только если вы добавляете данные ПОСЛЕ создания элемента управления списком.

0 голосов
/ 13 июня 2009

Если вы хотите, чтобы список изменялся вместе с изменением базовых данных, вам нужно использовать 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.

...