AS3让我疯了

时间:2009-08-14 20:14:51

标签: actionscript-3 arrays class object return

好的,这是我目前正在尝试做的事情。我有一个名为vdata.as的类,其中2个参数都是从主阶段发送的字符串。参数一是我需要打开和读取的XML文件的位置。第二个参数是我当前正在寻找的视频的名称。

现在我可以从XML文件中获取数据并显示它,如果从我的类中调用它,但当我尝试从阶段访问任何问题时,我会得到未定义。

import flash.net.*;
import flash.display.*;
import flash.events.*;

public class videoData
    {
      private var mName:String;
  private var mLink:String;
  private var mCategory:String;
      public static var elementArray:Array;

      // Constructor
  public function videoData(xmlPath:String,xmlVidSrc:String,pMC:MovieClip)
  {
        pXmlPath = xmlPath;
    pXmlVidSrc = xmlVidSrc;
    xmlloader = new URLLoader();
            elementArray = new Array();
  }

      public function getXML()
  {
    XMLData();
      }

      private function XMLData()
  {
        xmlloader.load(new URLRequest(pXmlPath));
    xmlloader.addEventListener(Event.COMPLETE,parseXMLData);

      } 

      private function parseXMLData():void
  {
    var x:XML = new XML(xmlloader.data);
        Init(x);    
  }

      private function Init(m:XML):*
  {
        var i:Number;
    for(i=0; i<m.videos.videoname.length(); i++)
    {
        if(m.videos.videoname[i].@name == pXmlVidSrc)
        {
        videoData.elementArray.push(m.videos.videoname[i].@name);
        videoData.elementArray.push(m.videos.videoname[i].@category);
        videoData.elementArray.push(m.videos.videoname[i].link.@url);
                 }
    }
}           

}

当我从主阶段调用它时,代码如下。

var xData:videoData = new videoData(xmlPath,vidSrc,this); xData.getXML();

然后当我尝试访问videoData.elementArray的任何元素时,它们会出现未定义的... 我只是把我的头砸在我的桌子上试图解决这个问题,任何帮助都会很棒。

2 个答案:

答案 0 :(得分:1)

为什么elementArray是一个静态var,你只需要将它公开以在函数外部使用它。

我很困惑,但您可能想尝试像“De MonsterDebugger”这样的调试工具,我首先要在parseXMLData函数中跟踪xmlloader.data。

答案 1 :(得分:0)

“addEventListener”没有“触发”......事件确实如此。您需要为已填充elementArray的阶段添加一个布尔状态,并在init函数之后设置该状态。

elementArray是否需要在所有videoData实例中都为true?如果没有,它不应该是静态的。您可以使用MovieClip(this.root).xData从其他类中访问该视频类的实例。

如果事件已完成并且数组仍为空 - 那么解析器不会填充它。你也可以做检查,看看elementArray.length&gt; 0

编辑回应评论:

作为公共成员或最好是只读属性创建一个布尔变量:

var parseComplete:Boolean;

在构造函数中将其设置为false。

然后,在Event.COMPLETE回调集中调用“Init”之后:

parseComplete=true;

然后在访问elementArray之前确保parseComplete == true。如果您正在等待解析器完成,您可能希望设置超时或某种尝试/捕获机制,以防万一会出现某种意外错误:

while( !xData.parseComplete ) { }

无限循环。这一切都取决于用法。就个人而言,我可能会从事件监听器向舞台添加一个回调来触发接下来会发生的事情。