Пользовательский компонент, содержащий проблему filterFunction при использовании нескольких экземпляров - PullRequest
0 голосов
/ 06 апреля 2011

У меня есть основное приложение, которое использует два экземпляра пользовательского компонента DropDownList MXML.

Я включил всю логику и запросы в пользовательский компонент, чтобы запросить MySQL и заполнить ArrayCollection результатом.

В моем первом DropDownList я хочу показать все доступные валюты, доступные в моей базе данных.

Во втором DropDownList я только хочу показать валюты CAD и USD с использованием функции filterFunction.

Я не знаю почему, но как только функция filterFunction применена к первому элементу, второй действует так, как будто они совместно используют одну и ту же переменную currencyciesList (ЭТО МОЯ ПРОБЛЕМА).

[Bindable] для CurrenciesList требуется для привязки к моему aSyncListView.

public для 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)

СПАСИБО ЗА ПОМОЩЬ!

Ответы [ 2 ]

1 голос
/ 06 апреля 2011

Когда вам нужно иметь один и тот же список в нескольких местах с разными фильтрами, вам нужен ListCollectionView. Таким образом, вы можете применить фильтр к it , и вы не затронете исходный список. Это так же просто, как:

var secondList:ListCollectionView = new ListCollectionView(originalList);

И ваш secondList может иметь любой фильтр, который вам нравится, не затрагивая первоначальный список, с дополнительным преимуществом обновления при добавлении или удалении элементов из originalList.

См. Здесь: mx.collections.ListCollectionView

0 голосов
/ 06 апреля 2011

Попробуйте изменить свой код следующим образом:

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

Надеюсь, это поможет!

...