apache flex -使用多个实例时,自定义组件包含filterFunction问题



我有一个主应用程序,使用两个实例的自定义MXML下拉列表组件。

我在自定义组件中包含了所有的逻辑和查询,以查询MySQL并将结果填充到ArrayCollection中。

在我的第一个下拉列表中,我想显示数据库中所有可用的货币。

在第二个下拉列表中,我只想使用filterFunction显示CAD和USD货币。

我不知道为什么,但是一旦filterFunction应用于第一个元素,第二个行为就像他们共享相同的currenciesList变量(这是我的问题)。

[Bindable] for currenciesList需要绑定到我的aSyncListView。

public for currenciesList是必需的,以便在主应用程序中使用。

无论我的变量是公共的还是私有的,我都有同样的错误…请查看此消息末尾的输出


在我的主应用程序的调用看起来像:

<mx:Form>
  <formElems:DropDownListCurrencies id="product_cost_price_curr"
    currencyCadUsdOnly="true"/>
  <formElems:DropDownListCurrencies id="product_price_curr"/>
</mx:Form>

现在我的定制组件:

<fx:Script>
    <![CDATA[
        import classes.SharedFunctions;
        import mx.collections.ArrayCollection;
        import mx.controls.Alert;
        import mx.events.FlexEvent;
        import mx.rpc.events.ResultEvent;
        [Bindable]
        public var currenciesList:ArrayCollection;
        public var currencyCadUsdOnly:Boolean = false;
        protected function dropdownlist1_creationCompleteHandler(event:FlexEvent):void
        {
            getAllCurrenciesResult.token = currenciesService.getAllCurrencies();
            // DEBUG just to show the id of the component
            trace('id:' + this.id + ' (getAllCurrencies)');
        }
        protected function getAllCurrenciesResult_resultHandler(event:ResultEvent):void
        {
            currenciesList = getAllCurrenciesResult.lastResult;
            // DEBUG before filterFunction
            trace('id:' + this.id + ', currencyCadUsdOnly:' + currencyCadUsdOnly + ', currenciesList.length:' + currenciesList.length + ' (BEFORE filterFunction)');
            if (currencyCadUsdOnly == true) {
                currenciesList.filterFunction = filterCadUsdOnly;
                currenciesList.refresh();
            }
            // DEBUG after filterFunction
            trace('id:' + this.id + ', currencyCadUsdOnly:' + currencyCadUsdOnly + ', currenciesList.length:' + currenciesList.length + ' (AFTER filterFunction)');
        }
        protected function filterCadUsdOnly(obj:Object):Boolean
        {
            return (obj.code == 'CAD' || obj.code == 'USD');
        }
    ]]>
</fx:Script>
<fx:Declarations>
    <s:CallResponder id="getAllCurrenciesResult" result="getAllCurrenciesResult_resultHandler(event)"/>
    <currenciesservice:CurrenciesService id="currenciesService" fault="SharedFunctions.showError(event.fault.faultString, event.fault.faultDetail)" showBusyCursor="true"/>
</fx:Declarations>
<s:AsyncListView list="{currenciesList}"/>

最后让我们看一下控制台输出。我期望ArrayList在创建第二个组件时具有7的长度…:

id:product_prices_curr (getAllCurrencies)
id:product_cost_price_curr (getAllCurrencies)
id:product_prices_curr, currencyCadUsdOnly:true, currenciesList.length:7 (BEFORE filterFunction)
id:product_prices_curr, currencyCadUsdOnly:true, currenciesList.length:2 (AFTER filterFunction)
id:product_cost_price_curr, currencyCadUsdOnly:false, currenciesList.length:2 (BEFORE filterFunction)
id:product_cost_price_curr, currencyCadUsdOnly:false, currenciesList.length:2 (AFTER filterFunction)

谢谢你的帮助!

当您需要在多个地方使用不同的过滤器使用相同的列表时,您需要的是ListCollectionView。这样,您就可以对应用过滤器,而不会影响原始列表。就像这样简单:

var secondList:ListCollectionView = new ListCollectionView(originalList);

并且您的secondList可以有任何您喜欢的过滤器,而不会影响原始列表,具有在originalList添加或删除项目时更新的附加好处。

查看:mx.collections.ListCollectionView

尝试将您的代码更改为以下内容:

        if (currencyCadUsdOnly == true) {
            currenciesList = new ArrayCollection(currenciesList.source);
            currenciesList.filterFunction = filterCadUsdOnly;
            currenciesList.refresh();
        }

希望这对你有帮助!

相关内容

  • 没有找到相关文章

最新更新