首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Flex 3 scrollToIndex帮助

Flex 3 scrollToIndex帮助
EN

Stack Overflow用户
提问于 2009-11-10 10:48:47
回答 2查看 1.5K关注 0票数 1

我正在尝试根据通过键盘事件输入的文本搜索组合框。搜索正在工作,并且选择了正确的结果,但我似乎无法让scrollToIndex找到正确的项目,这应该是找到的结果(i)。它会滚动到输入的最后一个字母,我相信这是组合框的默认行为。我想我引用的事件目标是错误的。菜鸟把我的头发都扯出来了。你能帮上忙吗?谢谢。下面是函数:

代码语言:javascript
复制
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;
    }

}
}

控制:

代码语言:javascript
复制
<mx:ComboBox keyDown="textin(event);" id="thislist" change="processForm();" dataProvider="{xmllist}"/>
EN

回答 2

Stack Overflow用户

发布于 2009-11-10 11:12:08

如果event.target是一个mx.control.ComboBox,那么它就没有scrollToIndex方法,该方法是在mx.controls.ListBase中定义的方法,ComboBox不会继承它。请查看ComboBox的api参考。你在这里想要达到的结果到底是什么?如果您设置了ComboBox的选定索引,则应显示该索引处的项目。

EDIT:尝试替换event.target.scrollToIndex(i) (无论如何都会抛出错误),并将其替换为event.stopImmediatePropagation()。这将防止默认的键处理程序触发和重写您的事件处理程序。

票数 1
EN

Stack Overflow用户

发布于 2011-08-06 20:35:56

这里有一个解决方案,基于Kerri的代码和Ryan Lynch的建议。功劳要归功于那时。

它对我来说很有效,所以我将把完整的代码留在这里留给后人。:)

代码语言:javascript
复制
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;
            }
        }
    }
}

这个解决方案需要一个标签作为标签,并使用一个名为“dataProvider”的字段来执行搜索。您可以创建一个变量来存储字段的名称,并按如下方式使用它:

代码语言:javascript
复制
lDataProvider[i][FIELD_NAME_HERE].match( new RegExp( "^" + mSearchText, "i") )

玩得开心!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1705359

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档