Выбор Flex DropDown не работает при поиске элемента - PullRequest
2 голосов
/ 26 ноября 2011

так вот проблема, которая у меня до сих пор.Я пытался упростить свой код, чтобы попытаться понять это, но мне не повезло.У меня есть видовой стек, который содержит 1 раскрывающийся список на стек.У них один и тот же поставщик данных.Что я хочу сделать, это выбрать содержимое элемента из первого.Как только я это делаю, когда я нажимаю кнопку для перехода к следующему стеку, у меня появляется функция, которая выполняет поиск от индекса 0 до длины поставщика данных, и, если элемент из первого стека соответствует второму, я хочу, чтобы второй раскрывающийся список выбрал этот элемент.и показать его.У меня совпадает, и я пытаюсь выбрать его, но когда я запускаю приложение, оно появляется, как будто ничего не выбрано.Вот что у меня есть:

edit: я заставил его работать на простом примере, но когда я пытаюсь использовать его в моем более сложном примере, при нажатии этой кнопки по какой-то причине он сбрасывает значение selectedIndexдо -1.Как я могу предотвратить это?Это рабочий код для простого примера

<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
               xmlns:s="library://ns.adobe.com/flex/spark" 
               xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600" applicationComplete="popList()">
    <fx:Declarations>
        <!-- Place non-visual elements (e.g., services, value objects) here -->
    </fx:Declarations>


<fx:Script>
    <![CDATA[
        import mx.collections.ArrayCollection;
        import mx.controls.Alert;
        [Bindable]
        private var myList : ArrayCollection;

        [Bindable]
        private var selectedItem : String;

        [Bindable]
        private var index : int;

        [Bindable]
        private var ind : int;

        private function popList() : void {
            myList = new ArrayCollection();
            stack.initialize();
            myList.addItem("1");
            myList.addItem("2");
            myList.addItem("3");
            myList.addItem("4");
            myList.addItem("5");
            myList.addItem("6");
            first.initialize();
            second.initialize();
        }

        private function goNext() : void {
            selectedItem = first.selectedItem;
            stack.selectedChild = stackb;

            for(index = 0; index < myList.length; index++){
                var itemNow : String = myList[index].toString();
                if(selectedItem == myList[index].toString()){
                    ind = index;
                }
            }

        }

    ]]>
</fx:Script>
<mx:ViewStack id="stack" width="862" height="500">
    <s:NavigatorContent id="stacka">
        <s:DropDownList x="317" y="174" id="first" dataProvider="{myList}"></s:DropDownList>
        <s:Button id="next" x="335" y="263" label="Next" click="goNext()"/>
    </s:NavigatorContent>
    <s:NavigatorContent id="stackb">
        <s:DropDownList x="317" y="174" id="second" dataProvider="{myList}" selectedIndex="{ind}"></s:DropDownList>
    </s:NavigatorContent>
</mx:ViewStack>



</s:Application>

1 Ответ

2 голосов
/ 26 ноября 2011

Я не пытался запустить код, но у меня есть несколько наблюдений:

  1. Во-первых, не используйте один и тот же dataProvider для двух отдельных DropDownLists.Это вызывает странные проблемы.Это не имеет смысла, я понятия не имею, почему;но это так.Вы можете обмануть dataProvider, создав вторую коллекцию с использованием того же источника.Примерно так:

-

second.dataProvider = new ArrayCollection(myList.source);
  1. Во-вторых, вам не нужно вручную вызывать метод initialize для любого из DropDownLists.Это очень необычно.Событие initialize запускается как часть процесса создания;и я предполагаю, что метод инициализации является частью обработчика событий по умолчанию.Но запуск этого события - не то же самое, что запуск компонента в процессе его жизненного цикла.

  2. ViewStack не инициализирует свои дочерние элементы до изменения представления.Таким образом, вы, вероятно, устанавливаете selectedIndex во втором DropDownList до того, как этот DropDownList будет инициализирован, возможно, позволяя этому выпадающему списку потеряться.Вы можете бороться с этим, установив creationPolicy для всех в ViewStack.

  3. Вероятно, вы можете решить эту проблему с помощью привязки.Что-то вроде этого.

-

<s:DropDownList x="317" y="174" id="second" dataProvider="{myList}" selectedIndex="{first.selectedIndex}"></s:DropDownList>
  1. Ваш код для выбора следующего элемента сравнивает объект со строкой, поэтому вы всегда будете выбирать selectedItem.

Вы можете изменить свой цикл на что-то вроде этого:

        for(index = 0; index < myList.length; index++){
            if(selectedItem == myList[index]){
                second.selectedIndex = index;
            }
        }
  1. Но, если вы используете тот же dataProvider или его копию, почему вы даженужна петля?Просто используйте свойство selectedIndex:

-

second.selectedIndex = first.selectedIndex 

Помогает ли это?

Примечание: StackOverflow затрудняет форматирование кода внутри списка;извините за то, что не сохранил номера в моем списке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...