【问题标题】:Accessing a dataProvider with indexOf使用 indexOf 访问 dataProvider
【发布时间】:2009-06-12 19:36:13
【问题描述】:

我有一个列表对象,我正在通过 dataProvider 使用 addItem 向其中添加项目。

在将项目添加到列表之前,我想确保它不是重复的。我尝试在 dataProvider 上使用 indexOf 并返回 null。我已经尝试将它转换为一个数组并且它可以工作,但即使元素存在于 dataProvider 中,它也总是返回 -1。

我能够使用的唯一方法似乎有点老套,我想知道是否有更好的方法在 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>

【问题讨论】:

    标签: apache-flex dataprovider


    【解决方案1】:

    即使您将数组输入到 dataProvider 属性中,底层的 dataProvider 也始终是 ArrayCollection 类型而不是 Array。它支持数组作为输入,但使用构造函数将它们转换为 ArrayCollection:

    ArrayCollection(source:Array)
    

    您可以使用以下方法:

    ArrayCollection.contains(item:Object):Boolean 
    

    确保您没有添加重复项。

    【讨论】:

    • 谢谢。效果很好!我在 dataProvider 上使用了 contains 方法,它的行为正是我想要的。
    【解决方案2】:

    如果您希望列表随着基础数据的更改而更改,则需要使用 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。

    【讨论】:

    • 您的变量“arr”将始终为空。原因见 julotlafrite。
    【解决方案3】:

    您仍然可以使用 Array,但它不会像 ArrayCollection 那样是动态的...

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

    只有在创建列表控件之后添加数据时才需要调用它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-02-14
      • 1970-01-01
      • 2021-03-18
      • 1970-01-01
      • 2014-10-07
      • 2011-05-23
      • 1970-01-01
      相关资源
      最近更新 更多