Сброс поставщика данных Flex Dropdownlist при обновлении

У меня есть несколько элементов управления раскрывающимся списком, которые используют один и тот же поставщик данных (та же ссылка).

Я переопределил установленный метод поставщика данных для функции сортировки (код ниже). Проблема заключается в том, что, когда я устанавливаю этот общий поставщик данных в новый раскрывающийся список, все существующие выпадающие элементы управления, совместно использующие этот поставщик данных, не выбираются (теряют свои ранее выбранные значения).

    override public function set dataProvider(value:IList):void{
            if(value is ArrayCollection){
            var sort:Sort=new Sort();
            var sortField:SortField = new SortField();
            sortField.numeric=false;
            sort.fields=[sortField];

            ArrayCollection(value).sort=sort;
            ArrayCollection(value).refresh();
        }
        super.dataProvider=value; 
    }

person Saju    schedule 27.12.2012    source источник
comment
Сортировка dataProvider в каждом компоненте, похоже, приведет к возникновению случайных проблем, подобных этой, сейчас и / или в будущем. Можно ли просто отсортировать его за пределами компонента? Как правило, компонент не должен изменять данные во время рендеринга (некоторые компоненты диаграммы Flex делают это и предупреждают вас о том, что они повреждают данные). Приведенное ниже предложение от @Markus Rossler является правильным, за исключением того, что будьте осторожны, если индекс изменится в результате сортировки.   -  person Sunil D.    schedule 27.12.2012


Ответы (2)


Существует множество вопросов, связанных с совместным использованием dataProvider между компонентами. Мы сталкивались с этим со многими клиентами, использующими наш AutoCompleteComboBox.

Вы можете легко использовать один и тот же источник, но разные - отдельные - коллекции для каждого из ваших поставщиков данных.

var dataProvider1 :ArrayCollection = new ArrayCollection(someArray);
var dataProvider2 :ArrayCollection = new ArrayCollection(someArray);
var dataProvider3 :ArrayCollection = new ArrayCollection(someArray);

Каждая коллекция - это просто оболочка вокруг базового источника. Сортировка одного не повлияет на остальные, оставив другие поля со списком или раскрывающиеся списки нетронутыми.

person JeffryHouser    schedule 28.12.2012
comment
Я создал новые экземпляры списка, и проблема была решена. Спасибо всем. :) - person Saju; 28.12.2012

Я не исследовал этот вопрос, но возникают две проблемы / идеи:

  1. если вы буквально используете одну и ту же ссылку на одну и ту же коллекцию массивов, вам не нужно сортировать этот массив более одного раза (и вы фактически делаете это, назначая одну и ту же коллекцию массивов более одного раза)
  2. если речь идет только о раскрывающихся списках с одним выбором, то есть простое решение:

    var oldSelected : TypeOfItem = selectedItem as TypeOfItem;
    // do the sort (like in your code)
    super.dataProvider=value;
    selectedIndex = getItemIndex(oldSelected);
    
person Markus Rossler    schedule 27.12.2012
comment
другая идея (непроверенная!): выполните назначение провайдера данных в первой строке, а не в последней. - person Markus Rossler; 27.12.2012
comment
Я попробовал второй подход, но не работал. Что касается первого, я не могу определить, отсортирован ли поставщик данных или нет. Я всегда хочу, чтобы в раскрывающемся списке отображался отсортированный список, где бы они ни использовались, с одинаковыми. - person Saju; 28.12.2012
comment
о сортировке: я имею в виду, что если вы используете одну коллекцию массивов для более чем одного выпадающего списка, тогда вы фактически вызываете сортировку для каждого myDropDown.dataProvider = theOneArrayCollection; назначение. как насчет сортировки коллекции массивов только один раз и назначения уже примененной к сортировке версии коллекции массивов в раскрывающихся списках? - person Markus Rossler; 28.12.2012