代码之家  ›  专栏  ›  技术社区  ›  martinml

ActionScript 3.0-更改从类导入的Url

  •  1
  • martinml  · 技术社区  · 7 年前

    我想导入一个XML文件并将其添加到网格中。我已经完成了这一部分,但我想使用该类更改XML文件。现在,文件卡在原始文件上。

    示例类:

    package {
        import fl.controls.dataGridClasses.DataGridColumn;
        import fl.data.DataProvider;
        import flash.net.*;
        import flash.events.*;
        import fl.controls.DataGrid;
        import fl.data.DataProvider;
        import flash.display.Stage;
        import flash.display.MovieClip
    
        public class Tabellkamp extends MovieClip {
            public var link1: String = new String("_blank");
            public var request: URLRequest;
            public var loader: URLLoader;
            public var gridd: DataGrid = new DataGrid();
    
            public function Tabellkamp() {
                loader.load(request);
                loader.addEventListener(Event.COMPLETE, loaderCompleteHandler);
                var loader: URLLoader = new URLLoader();
    
                loader.load(new URLRequest(link1));
            }
    
            function loaderCompleteHandler(event: Event): void {
                var teamXML: XML = new XML(loader.data);
                var firstCol: DataGridColumn = new DataGridColumn("somthing on the xml");
                firstCol.headerText = "first";
                gridd.columns = [firstCol];
                addChild(gridd);
            }
        }
    }
    

    主要时间线/其他类别:

    public class Lagegridd extends MovieClip {
    
        public function Lagegridd() {
    
            btn_1.addEventListener(MouseEvent.CLICK, fl_MouseClickHandler);
    
            function fl_MouseClickHandler(event: MouseEvent) {
                var newXML: Tabellkamp = new Tabellkamp();
                newXML.link1="newxmlfile.xml";
                addChild(newXML);
            }
    

    代码可能还有其他问题,但主要问题是如何更改url,然后 addChild() . 不用管网格,这只是一个例子。

    1 回复  |  直到 7 年前
        1
  •  1
  •   Organis    7 年前

    很简单。销毁现有实例并创建一个新实例。此外,不要在其他函数中声明函数。

    public class Lagegridd extends MovieClip
    {
        public function Lagegridd()
        {
            btn_1.addEventListener(MouseEvent.CLICK, onClick);
        }
    
        private var currentGrid:Tabellkamp;
        private var gridSource:Array = ["file1.xml", "file2.xml", "file3.xml"];
    
        private function onClick(e:MouseEvent):void
        {
            // Obtain the first element from the list.
            var anUrl:String = gridSource.shift();
    
            changeGrid(anUrl);
        }
    
        private function changeGrid(url:String):void
        {
            if (currentGrid)
            {
                removeChild(currentGrid);
    
                // Another cleanup routines here, if necessary.
            }
    
            currentGrid = new Tabellkamp;
    
            // You need to define this function instead of loading
            // data from "link1" inside the object constructor.
            currentGrid.loadData(url);
    
            addChild(currentGrid);
        }
    }
    

    :OOP示例。

    package
    {
        import flash.display.Sprite;
    
        import flash.system.System;
    
        import flash.events.Event;
        import flash.events.IOErrorEvent;
        import flash.events.SecurityErrorEvent;
    
        import flash.net.URLRequest;
        import flash.net.URLLoader;
    
        // Don't use MovieClip if you don't have frames and timelines.
        public class LasteinnXML extends Sprite
        {
            public var url:String;
            public var loader:URLLoader;
    
            public var dataProvider:XML;
    
            public function load(path:String):void
            {
                url = path;
    
                loader = new URLLoader;
                loader.addEventListener(Event.COMPLETE, onData);
    
                // Always handle erroneous cases. Last three arguments are there
                // because it is wise to not unsubscribe from these events but
                // let the garbage collector decide when to destroy them.
                loader.addEventListener(IOErrorEvent.IO_ERROR, onError, false, 0, true);
                loader.addEventListener(SecurityErrorEvent.SECURITY_ERROR, onError, false, 0, true);
    
                // You don't need to store the request object.
                loader.load(new URLRequest(url));
            }
    
            private function onData(e:Event):void
            {
                try
                {
                    dataProvider = new XML(loader.data);
                    finishLoading();
                }
                catch (fail:Error)
                {
                    // There's another erroneous case even if loading is fine:
                    // Invalid XML data. Always chack for it as well.
                    onError(null);
                }
    
                // Handle the SUCCESSFUL case here.
            }
    
            private function finishLoading():void
            {
                // Cleanup routines. Dispose of your objects once you don't need them.
                if (!loader) return;
    
                loader.removeEventListener(Event.COMPLETE, onData);
    
                loader = null;
            }
    
            private function onError(e:Event):void
            {
                // In case the object was already destroyed
                if (!loader) return;
    
                finishLoading();
    
                // Handle the ERRONEOUS case here.
            }
    
            public function destroy():void
            {
                finishLoading();
    
                // The recommended way of cleaning XML data up.
                if (dataProvider)
                {
                    System.disposeXML(dataProvider);
                    dataProvider = null;
                }
            }
        }
    }
    

    用法:

    var A:LasteinnXML = new LasteinnXML;
    var B:LasteinnXML = new LasteinnXML;
    var C:LasteinnXML = new LasteinnXML;
    
    addChild(A);
    addChild(B);
    addChild(C);
    
    A.load("filea.xml");
    B.load("fileb.xml");
    C.load("filec.xml");
    
    C.destroy();
    removeChild(C);