代码之家  ›  专栏  ›  技术社区  ›  Chunky Chunk

操作脚本-实时搜索和更新数据提供程序列表?

  •  1
  • Chunky Chunk  · 技术社区  · 14 年前

    我想将实时搜索添加到数据提供程序是一个非常大的XML的列表中。为了简单起见,假设我的XML只是世界上180个国家的列表:

    package
    {
    //Imports
    import fl.controls.List;
    import fl.data.DataProvider;
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.events.MouseEvent;
    import flash.events.IOErrorEvent;
    import flash.net.URLLoader;
    import flash.net.URLRequest;
    
    //Class
    public class LiveSearchXMLList extends Sprite
        {
        //Variables
        private var XMLData:XML;
        private var dp:DataProvider;
        private var list:List;
    
        //Constructor
        public function LiveSearchXMLList()
            {
            addEventListener(Event.ADDED_TO_STAGE, init);
            }
    
        //Initialization
        private function init(evt:Event):void
            {
            removeEventListener(Event.ADDED_TO_STAGE, init);
    
            //Download XML File
            var XMLLoader:URLLoader = new URLLoader();
            XMLLoader.addEventListener(IOErrorEvent.IO_ERROR, IOEventErrorHandler);
            XMLLoader.addEventListener(Event.COMPLETE, XMLLoaderCompleteEventHandler);
            XMLLoader.load(new URLRequest( /* COUNTRY_LIST_XML_FILE */ ));
            }
    
        //XMLLoader Error Handler
        private function IOEventErrorHandler(evt:IOErrorEvent):void
            {
            //Remove Event Listeners
            evt.target.removeEventListener(IOErrorEvent.IO_ERROR, IOEventErrorHandler);
            evt.target.removeEventListener(Event.COMPLETE, XMLLoaderCompleteEventHandler);
    
            //Throw Error
            throw(evt.text);
            }
    
        //XMLLoader Complete Handler
        private function XMLLoaderCompleteEventHandler(evt:Event):void
            {
            //Remove Event Listeners
            evt.target.removeEventListener(IOErrorEvent.IO_ERROR, IOEventErrorHandler);
            evt.target.removeEventListener(Event.COMPLETE, XMLLoaderCompleteEventHandler);
    
            //Assign XMLData
            XMLData = new XML(evt.target.data);
    
            createList();
            }
    
        //List
        private function createList():void
            {
            //Assign And Alphabetize Data
            dp = new DataProvider(XMLData);
            dp.sortOn("countryName");
    
            //Create List Object
            list = new List();
            list.width = 400;
            list.height = 400;
            list.x = list.y = 25;
            list.labelField = "countryName";
            list.dataProvider = dp;
            }
        }
    }
    

    列表的labelfields由XML元素的 <countryName> 按字母顺序排列。

    我想创建一个输入文本字段,它将监听击键并根据与countryname元素值匹配的输入字符串更新列表。因此,如果我在文本字段中输入“can”,列表将突然减少到5行:

    • 美属萨摩亚
    • 加拿大
    • 中非共和国
    • 多米尼加共和国
    • 梵蒂冈城

    当然,Live Search也应该是非破坏性的-按一下Delete键,搜索字段现在会显示“ca”,这会将5行列表增加到21行。(南极洲、牙买加等)

    这是怎么做到的?实时搜索和更新XML提供的列表对象的最快或最常见的方法是什么?

    1 回复  |  直到 14 年前
        1
  •  1
  •   Ryan Guill    14 年前

    private function inpFilter_change ( e:Event ) : void
    {
        var searchString:String = StringUtil.trim(inpFilter.text).toLowerCase();
    
        if ( searchString.length )
        {
            var newAC:ArrayCollection = new ArrayCollection();
    
            for each ( var tempObject:Object in _acData)
            {
                if ( tempObject.countryName.toString().indexOf(searchString) != -1 )
                {
                    newAC.addItem(tempObject);
                }
            }
    
            _acFilteredData = newAC;
    
            listControl.dispatchEvent(new ListEvent(ListEvent.CHANGE)); //might not be necessary, but will force the control to update  
        }
        else
        {
            _acFilteredData = _acData;
        }
    
    }