Avatar billede interkriller Nybegynder
16. marts 2009 - 15:53 Der er 4 kommentarer og
1 løsning

Kan ikke returnere array fra anden class

Jeg er igang med at sætte mig lidt ind i actionscript/side og har til det formål besluttet mig for at lave en hjemmeside i flash som henter data fra min mysql db.
Jeg har fundet ud af at udtrække dataen, men det er arkitekturen jeg har lidt problemer med. Jeg har et movieklip som skal kalde en klasse som trækker den ønskede data ud og returnerer det som et Array, men det vil sgu ikke :)

Min Movieclip class:
package
{
    import flash.display.*
    import flash.net.*
    import Connection
   
    public class MenuContainer extends MovieClip
   
    {
        public var projectsArray:Array = new Array();
        public var myConnection:Connection = new Connection();
       
        public function MenuContainer()
        {
            projectsArray = myConnection.getProjectsArray();
            populate();
        }
       
        private function populate():void
        {
           
            trace("the array is " + projectsArray.length +" elements long");
           
            var menuItemArray:Array = new Array();
            for(var i=0;i<projectsArray.length; i++)
            {
                trace("here we are in menuItemArray");
                var fooClip:MovieClip = new MovieClip();
                menuItemArray.push(fooClip);
                trace(String(projectsArray[0][0]));
            }
        }
    }
}




Min mysql connection class:

package
{
    import flash.net.*;
    import flash.display.*;
   
    class Connection
    {
        public var _projectsArray:Array = new Array();
        public var gw:NetConnection = new NetConnection();
        public var res:Responder = new Responder(onResult, onFault);
       
        public function Connection()
        {
            gw.connect("http://minhjemmeside.dk/amfphp/gateway.php");
            callAmfphp();
        }       
        public function onResult(responds:Object):void
        {
            var tmpProjectsArray:Array = new Array(responds.length);
            for(var i=0;i<responds.length; i++)
            {
                tmpProjectsArray[i]= new Array(responds[0].length);
                for(var j=0;j<responds[0].length;j++)
                {
                    tmpProjectsArray[i][j]=String(responds[i][j]);
                }
            }
            _projectsArray = tmpProjectsArray;
            trace(_projectsArray[1][0]);
        }
       
        public function onFault(responds:Object):void
        {
            for(var i in responds)
            {
                trace(responds[i]);
            }
        }
        public function callAmfphp()
        {
            gw.call("customServices.GetProjectsArray.getAllProjects",res);
        }
       
        public function getProjectsArray():Array
        {
            return _projectsArray;
        }
    }
}




Jeg ved at hvis jeg laver en trace i "onResult" så udskrives den korrekte data, men den bliver ikke returneret til min movieclip class.
Avatar billede andersbro Nybegynder
16. marts 2009 - 23:27 #1
Er det ikke noget med, at du kalder populate inden din connection har modtaget data?

Du skal i din movieclip class lægge en eventlistener på din connection. I connection skal du så dispatche en tilsvarende event, når data er loadet. Når eventlistener'en opfanger event'en, kan du kalde populate.

Giver det mening?
Avatar billede interkriller Nybegynder
16. marts 2009 - 23:37 #2
Det giver ret god mening (hvertfald det af det jeg forstår :) efter at have kørt en debug virker det som om at populate kaldes før data er modtaget.
Har prøvet noget while(!myConnection.getProjectsArray()), men det virkede ikke.

Det med at dispatche en tilsvarende event og få eventlisteneren til at opfange event er jeg lidt mere i tvivl om hvordan jeg skal gøre. Kan du uddybe en smule?
Avatar billede interkriller Nybegynder
17. marts 2009 - 00:29 #3
Har prøvet at finde ud af hvordan det fungerer, men har det ikke helt på plads:

jeg har tilføjet en eventdispatcher i connection:

package {
    import flash.net.*;
    import flash.display.*;
    import flash.events.Event;
    import flash.events.EventDispatcher;

    class Connection {
        public var _projectsArray:Array = new Array();
        public var gw:NetConnection = new NetConnection();
        public var res:Responder=new Responder(onResult,onFault);
        public static var evt:EventDispatcher = new EventDispatcher();

        public function Connection() {
            gw.connect("http://minhjemmeside.dk/amfphp/gateway.php");
            callAmfphp();
        }
        public function onResult(responds:Object):void {
            var tmpProjectsArray:Array=new Array(responds.length);
            for (var i=0; i<responds.length; i++) {
                tmpProjectsArray[i]=new Array(responds[0].length);
                for (var j=0; j<responds[0].length; j++) {
                    tmpProjectsArray[i][j]=String(responds[i][j]);
                }
            }
            _projectsArray=tmpProjectsArray;
            trace(_projectsArray[1][0]);
            evt.dispatchEvent(new Event("arrayFull"));
        }

        public function onFault(responds:Object):void {
            for (var i in responds) {
                trace(responds[i]);
            }
        }
        public function callAmfphp() {
            gw.call("customServices.GetProjectsArray.getAllProjects",res);
        }

        public function getProjectsArray():Array {
            return _projectsArray;
        }
    }
}


og så har jeg tilføjet en listener i min movieclip class, men den modtager dog ikke noget. Ret sikker på jeg har misforstået et eller andet :)

package {
    import flash.display.*;
    import flash.events.Event;
    import flash.net.*;
    import Connection;
    public class MenuContainer extends MovieClip {

        var projectsArray:Array = new Array();
        var myConnection:Connection = new Connection();

        public function MenuContainer() {
            this.addEventListener("arrayFull", populate);
        }

        public function populate(projectsArray:Array):void {

            trace("the array is " + projectsArray.length +" elements long");
            projectsArray=myConnection.getProjectsArray();
            var menuItemArray:Array = new Array();
            for (var i=0; i<projectsArray.length; i++) {
                trace("here we are in menuItemArray");
                var fooClip:MovieClip = new MovieClip();
                menuItemArray.push(fooClip);
                trace(String(projectsArray[0][0]));
            }
        }
    }
}
Avatar billede interkriller Nybegynder
17. marts 2009 - 10:10 #4
Vupti duh :)

Så lykkedes med en god gang trial and error. Det var ganske rigtigt et spørgsmål om at få en eventdispatcher op.

Smid et svar
Avatar billede andersbro Nybegynder
18. marts 2009 - 21:04 #5
Der er svar lige her. Nåede ikke at uddybe, men det er jo også meget federe selv at knække nødden!
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester