PDA

View Full Version : How can I pass XMLList from one class file to another class file.


nd2639
08-19-2009, 02:20 PM
I am new to AS3 but I am trying to pass XMLList from one class to another class using public function get.

Below is the code I am using.
XMLContents.as
package com.ad.loading
{
/**
* ...
* @author AndyDohare
*/

//----------- Import Statements -----------\\
import com.ad.loading.LoadXML;
import flash.display.MovieClip;
import flash.events.*;

public class XMLContents extends EventDispatcher
{
//----------- Declaring Variables -----------\\
private var _xmlPath:String = "com/data/xml/tabs.xml"; //Can also pass RSS feed for e.g; "http://theflashblog.com/?feed=rss"
private var _loadXML:LoadXML;
private var _xmlLoadedData:XML;

public var _xmlMainTitle:*;
public var __xmlList:XMLList;
public var _myTabLabels:String;
public var _tabTitle:String;

//----------- Declaring Constructor Function -----------\\
public function XMLContents():void
{
_loadXML = new LoadXML(_xmlPath);
_loadXML.addEventListener("XML_LOADED", onXMLLoaded, false, 0, true);
}

private function onXMLLoaded(evt:Event):void
{
_xmlLoadedData = new XML(_loadXML.XMLdata);
__xmlList = _xmlLoadedData.children();
//trace("A.D. XMLContents -- onXMLLoaded() :: evt.target.data :: " + evt.target.data);

dispatchEvent(new Event("XML_CONTENTS"));

ParseXMLContents(__xmlList);
//trace(__xmlList);
}


public function ParseXMLContents(_xmlCont:XMLList):void
{
//_myTabLabels = _xmlCont.@label;

for (var i:int = 0; i < _xmlCont.length(); i++)
{
_myTabLabels = _xmlCont[i].attribute("label");
//__xmlList = _xmlCont[i].elements();
trace("A.D. XMLContents() : ParseXMLContents() : [" + i + "] : " + _myTabLabels);
}
}


//----------- Getters and Setters -----------\\
public function get xmlListOfAllTabs():XMLList
{
return this.__xmlList;
}

public function set xmlListOfAllTabs(__xml:XMLList):void
{
this.__xmlList = __xml;
}

public function get myTabLabels():String
{
return _myTabLabels;
}

}
}

allTabs.as
package com.ad
{
/**
* ...
* @author AndyDohare
*/

import flash.display.MovieClip
import flash.events.*;

import com.ad.myTab;
import com.events.TabEvents;
import com.ad.loading.XMLContents;

public class allTabs extends MovieClip
{
/*
* Properties
*
**/
private var _myTab :myTab;
private var _tabGaps :Number = 1;
private var _myTabText :String;
private var _myTabXPosition :Number;
private var _myTabName :String;
private var _tabClicked :String;
private var _xmlContents :XMLContents;

private var _tween :Tween;
private var _movedBoolean :Boolean = true;

/*
* Constructor Function
*
**/
public function allTabs()
{
trace("A.D. allTabs() .. Loaded .. ");
_xmlContents = new XMLContents();
_xmlContents.addEventListener(Event.COMPLETE, onCompleteXMLContents, false, 0, true);

//trace("A.D. allTabs :::: XMLContents.xmlListOfAllTabs ::::::: " + _xmlContents.xmlListOfAllTabs);

for (var i:uint = 0; i < 5; i++)
{
_myTab = new myTab("_myTab " + i);
_myTab.x = (_myTab.width + _tabGaps) * i;
_myTab.y = 0;

//_myTabXPosition = _myTab.x;
//_myTabName = _myTab.name;
//trace("XXX : " + _myTabXPosition);
//trace("XXX Name : " + _myTab.name);

addEventListener(MouseEvent.CLICK, onTabClick, false, 0, true);
addChild(_myTab);
}

}

/*
* Methods
*
**/
private function onTabClick(evt:MouseEvent):void
{
//dispatchEvent(new TabEvents(TabEvents.THIS_TAB_CLICKED));
dispatchEvent(new Event("TAB_IS_CLICKED"));

//trace("A.D. allTabs : evt.target.X : " + evt.target.x);
_tabClicked = evt.target.name;
trace("A.D. allTabs : onTabClick : _tabClicked :" + _tabClicked);
tabName(_tabClicked);
}
}
}

The problem is I get a "null" on trace.

Please ignore the extra code and thanks a lot in advance.

Andy D :eek:

Lexico
08-20-2009, 12:12 AM
If I understand correctly, you're trying to trace the attribute "xmlListAllTabs" right after you instantiated _xmlContents. You should do that when the XMLContents class dispatches the Complete event (that's why you have a "Complete" listener!)

nd2639
08-20-2009, 09:39 PM
Actually what I am trying to do is have one class file (XMLContents) and use getter functions to get the data from XML and use it anywhere in the other class files. Like I am trying to do in "allTabs" class file. I want to get the XMLList from XMLContents class file from get "xmlListOfAllTabs". But all I get is null result. I am tracing it in line 28 in allTabs class file.

I cleared the codes a little.

allTabs.as

package com.ad
{
/**
* ...
* @author AndyDohare
*/

import flash.display.MovieClip
import flash.events.*;

import com.ad.myTab;
import com.events.TabEvents;
import com.ad.loading.XMLContents;

public class allTabs extends MovieClip
{
//----------- Declaring Variables -----------\\
private var _myTab :myTab;
private var _tabGaps :Number = 1;
private var _myTabXPosition :Number;
private var _tabClicked :String;
private var _xmlContents :XMLContents;

//----------- Constructor Function -----------\\
public function allTabs()
{
_xmlContents = new XMLContents();
trace("A.D. XMLContents :::::::::::::::: /n" + _xmlContents.myTabLabels);

for (var i:uint = 0; i < 5; i++)
{
_myTab = new myTab("_myTab " + i);
_myTab.x = (_myTab.width + _tabGaps) * i;
_myTab.y = 0;

addEventListener(MouseEvent.CLICK, onTabClick, false, 0, true);
addChild(_myTab);
}
}

//----------- Methods -----------\\
private function onTabClick(evt:MouseEvent):void
{
dispatchEvent(new Event("TAB_IS_CLICKED"));

_tabClicked = evt.target.name;
trace("A.D. allTabs : onTabClick : _tabClicked :" + _tabClicked);
tabName(_tabClicked);
}

private function tabName(_name:String):void
{
trace("A.D. allTabs : ____________ _tabClicked :" + _name);
}

//----------- Getter and Setter -----------\\
public function get tabXPosition():Number
{
return _myTabXPosition;
}

public function get tabClickedName():String
{
return _tabClicked;
}
}
}


XMLContents.as class file

package com.ad.loading
{
/**
* ...
* @author AndyDohare
*/

//----------- Import Statements -----------\\
import com.ad.loading.LoadXML;
import flash.display.MovieClip;
import flash.events.*;

public class extends EventDispatcher
{
//----------- Declaring Variables -----------\\
private var _xmlPath:String = "com/data/xml/tabs.xml";
private var _loadXML:LoadXML;
private var _xmlLoadedData:XML;

public var _xmlMainTitle:*;
public var __xmlList:XMLList;
public var _myTabLabels:String;

//----------- Declaring Constructor Function -----------\\
public function XMLContents():void
{
_loadXML = new LoadXML(_xmlPath);
_loadXML.addEventListener("XML_LOADED", onXMLLoaded, false, 0, true);
}

private function onXMLLoaded(evt:Event):void
{
_xmlLoadedData = new XML(_loadXML.XMLdata);
__xmlList = _xmlLoadedData.children();

ParseXMLContents(__xmlList);
dispatchEvent(new Event("XML_CONTENTS"));
}

private function ParseXMLContents(_xmlCont:XMLList):void
{
for (var i:int = 0; i < _xmlCont.length(); i++)
{
_myTabLabels = _xmlCont[i].attribute("label");
trace("A.D. XMLContents() : ParseXMLContents() : [" + i + "] : " + _myTabLabels);
}
}


//----------- Getters and Setters -----------\\
public function get xmlListOfAllTabs():XMLList
{
return __xmlList;
}

public function get myTabLabels():String
{
return _myTabLabels;
}
}
}


I apalogies if I am repeating the question. As you please understand that I am new to actionscript and I really appreciate your help.
Thanks
Andy D

wvxvw
08-20-2009, 09:43 PM
As Lexico said, you need to access loaded data only after it is loaded - that is why you added a listener. Not before that listener fires, the data that you're loading will not became available, because until it happens only travels between the server and your application, but haven't arrived yet.