【问题标题】:AS3 driving me nutsAS3 让我抓狂
【发布时间】:2010-11-19 18:43:14
【问题描述】:

好的,这就是我目前正在尝试做的事情。我有一个名为 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 的任何元素时,它们出现未定义... 我只是在我的桌子上敲我的头,试图弄清楚这一点,任何帮助都会很棒。

【问题讨论】:

    标签: actionscript-3 arrays class object return


    【解决方案1】:

    为什么elementArray是静态var,只要把它设为public就可以在函数外使用了。

    我很困惑,但您可能想尝试“De MonsterDebugger”之类的调试工具,我将从跟踪 parseXMLData 函数中的 xmlloader.data 开始。

    【讨论】:

    • 基本上它要做的是将 XML 数据转储到一个数组并将其返回到主阶段,这样我就可以在应用程序中的其他地方使用它。但目前它不起作用。就像我说的,我可以在课堂上看到数据,但无法在主舞台上查看。实际上,在 addeventlistener 触发后我什至看不到它。生病检查调试器,看看它出现了什么。
    【解决方案2】:

    “addEventListener”不会“触发”...事件会触发。您需要为已填充 elementArray 的阶段添加一个布尔值,并在 init 函数之后设置它。

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

    如果事件已经完成并且数组仍然是空的 - 那么它没有被你的解析器填充。您还可以检查 elementArray.length 是否 > 0。

    编辑回应评论:

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

    var parseComplete:Boolean;
    

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

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

    parseComplete=true;
    

    然后在访问 elementArray 之前确保 parseComplete == true。如果您正在等待解析器完成,您可能需要设置超时或某种 try/catch 机制,以防万一出现任何会导致某种意外错误:

    while( !xData.parseComplete ) { }
    

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

    【讨论】:

    • 谢谢。很抱歉很痛苦,但我可以举一个例子来说明“为舞台添加一个布尔值”是什么意思吗?我想我有一个想法,但只是想确定一下。并且没有 elementArray 不需要是真的,我只是从中删除了静态。
    猜你喜欢
    • 1970-01-01
    • 2010-12-29
    • 2011-05-09
    • 2014-05-19
    • 2010-12-03
    • 1970-01-01
    • 1970-01-01
    • 2011-05-20
    • 1970-01-01
    相关资源
    最近更新 更多