Flex 3 scrollToIndex Справка - PullRequest
       13

Flex 3 scrollToIndex Справка

1 голос
/ 10 ноября 2009

Я пытаюсь найти комбинированный список на основе текста, введенного с помощью события клавиатуры. Поиск работает и правильный результат выбирается, но я не могу получить scrollToIndex, чтобы найти правильный элемент, который должен быть найденным результатом (i) Он прокручивается до последней введенной буквы, которая, по моему мнению, является стандартным поведением в поле со списком. Я думаю, что неправильно ссылаюсь на цель мероприятия. Новичок рвет на себе волосы. Вы можете помочь? Спасибо. Вот функция:

private function textin(event:KeyboardEvent):void 
{

var combo:ComboBox = event.target as ComboBox;

var source:XMLListCollection = combo.dataProvider as XMLListCollection;

str += String.fromCharCode(event.charCode);

if (str=="") {
  combo.selectedIndex = 0;
}

for (var i:int=0; i<source.length; i++) {

    if ( source[i].@name.match(new RegExp("^" + str, "i")) ) {
     combo.selectedIndex = i;
     event.target.scrollToIndex(i);
     break;
    }

}
}

Контроль:

<mx:ComboBox keyDown="textin(event);" id="thislist" change="processForm();" dataProvider="{xmllist}"/>

Ответы [ 2 ]

1 голос
/ 10 ноября 2009

Если event.target является mx.control.ComboBox, то у него нет метода scrollToIndex, который является методом, определенным в mx.controls.ListBase, от которого ComboBox не наследуется. Проверьте справочник API для ComboBox . Какого именно результата вы здесь добиваетесь? Если вы установите выбранный индекс ComboBox, он должен отображать элемент с этим индексом.

РЕДАКТИРОВАТЬ: Попробуйте заменить event.target.scrollToIndex(i) (что в любом случае должно вызвать ошибку) и заменить его на event.stopImmediatePropagation(). Это должно предотвратить запуск любого обработчика ключа по умолчанию и переопределение вашего обработчика событий.

0 голосов
/ 06 августа 2011

Вот решение, основанное на коде Керри и предложениях Райана Линча. Кредит идет на потом.

Это работает для меня, поэтому я оставлю здесь полный код для будущих поколений. :)

import com.utils.StringUtils;

import flash.events.KeyboardEvent;
import flash.events.TimerEvent;
import flash.utils.Timer;

import mx.collections.ArrayCollection;
import mx.controls.ComboBox;

public class ExtendedComboBox extends ComboBox
{
    private var mSearchText : String = "";

    private var mResetStringTimer : Timer;

    public function ExtendedComboBox()
    {
        super();

        mResetStringTimer = new Timer( 1000 );
        mResetStringTimer.addEventListener( TimerEvent.TIMER, function() : void { mResetStringTimer.stop(); mSearchText = ""; } );
    }       

    override protected function keyDownHandler( aEvent : KeyboardEvent ):void
    {
        if( aEvent.charCode < 32 )
        {
            super.keyDownHandler( aEvent );
            return;
        }

        var lComboBox : ComboBox = aEvent.target as ComboBox;

        var lDataProvider : ArrayCollection = lComboBox.dataProvider as ArrayCollection;

        mSearchText += String.fromCharCode( aEvent.charCode );

        if ( StringUtils.IsNullOrEmpty( mSearchText ) ) 
        {
            lComboBox.selectedIndex = 0;
            aEvent.stopImmediatePropagation();
            return;
        }

        if( mResetStringTimer.running )
            mResetStringTimer.reset();

        mResetStringTimer.start();

        for ( var i : int = 0; i < lDataProvider.length; i++ ) 
        {               
            if ( lDataProvider[i].label.match( new RegExp( "^" + mSearchText, "i") ) ) 
            {
                lComboBox.selectedIndex = i;
                aEvent.stopImmediatePropagation();
                break;
            }
        }
    }
}

Это решение ожидает ArrayCollection в качестве dataProvider и поле с именем "label" для выполнения поиска. Вы можете создать переменную для хранения имени поля и использовать ее следующим образом:

lDataProvider[i][FIELD_NAME_HERE].match( new RegExp( "^" + mSearchText, "i") )

Веселись!

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