我有一个主应用程序正在使用自定义MXML DropDownList组件的两个实例。
我在自定义组件中包含了所有逻辑和查询来查询MySQL并用结果填充ArrayCollection。
在我的第一个DropDownList中,我想显示我的数据库中可用的所有可用货币。
在第二个DropDownList中,我只想使用filterFunction显示CAD和USD货币。
我不知道为什么,但是一旦filterFunction应用于第一个元素,第二个行为就像它们共享相同的currencyList变量(这是我的问题)。
currencyList 的[Bindable] 需要绑定到我的aSyncListView。
currencyList 需要公开 才能在主应用中使用。
无论我的变量是公共变量还是私有变量,我都有同样的错误...请查看此消息末尾的输出。
我的主应用中的通话看起来像是:
<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)
感谢帮助!
答案 0 :(得分:1)
每当您需要在具有不同过滤器的多个位置使用相同的列表时,您需要的是ListCollectionView。这样您就可以将过滤器应用于 it ,并且不会影响原始列表。这很简单:
var secondList:ListCollectionView = new ListCollectionView(originalList);
您的secondList
可以拥有您喜欢的任何过滤条件,而不会影响原始列表,还可以在originalList
添加或删除项目时进行更新。
答案 1 :(得分:0)
尝试将您的代码更改为以下内容:
if (currencyCadUsdOnly == true) {
currenciesList = new ArrayCollection(currenciesList.source);
currenciesList.filterFunction = filterCadUsdOnly;
currenciesList.refresh();
}
希望这有帮助!