2012-08-22 171 views
0

我试图创建一个应用程序,它可以显示XML中的选项列表。 然后,当单击一个选项加载来自不同XML的数据以显示他们选择的选项[j]。在Flash AS3中加载XML

我在这里得到的代码只能在通过循环后进入最后一个变量,因此无论我点击哪个选项,它都会从最后一个选项进入数据。 它只删除原始按钮的最后一个孩子。

有没有人有任何想法,我怎么能得到它去正确的页面?

import flash.events.Event; 
import flash.text.TextField; 

var xmlLoader:URLLoader = new URLLoader(); 
var xmlReq:URLRequest = new URLRequest("http://praxis2.cit.ie/~patrickhallihan/DynamicContent/autumn/classxml.php"); 
xmlLoader.load(xmlReq); 

xmlLoader.addEventListener(Event.COMPLETE, getClasses); 
function getClasses(e:Event):void 
    { 
     var xmlobject:XML = new XML(e.target.data); 
     var classlist:XMLList = xmlobject.classgroup; 
     var classArray:Array = new Array(); 

     for (var i:int = 0; i<classlist.length(); i++) 
      { 
       var classname:String = xmlobject.classgroup.classname[i]; 
       var classtxt:TextField = new TextField(); 

       classtxt.width = 70; 
       classtxt.height = 20; 
       classtxt.border = true; 
       classtxt.borderColor = 0x000000; 
       classtxt.background = true; 
       classtxt.backgroundColor = 0x888888; 
       classtxt.textColor = 0xFFFFFF; 
       classtxt.text = "" + classname; 
       addChild (classtxt); 
       classArray[i] = classtxt; 
      } 

     for (var j:int = 0; j<classlist.length(); j++) 
      { 
       classArray[j].y = 40*j; 
       classArray[j].x = 125; 
       classArray[j].addEventListener(MouseEvent.CLICK, gotoSchedule); 

       function gotoSchedule(event:MouseEvent):void 
        { 
         removeChild (classtxt); 

         var xmlLoader1:URLLoader = new URLLoader(); 
         var xmlReq1:URLRequest = new URLRequest("http://praxis2.cit.ie/~patrickhallihan/DynamicContent/autumn/getschedule.php?id="+ j); 
         xmlLoader1.load(xmlReq1); 

         xmlLoader1.addEventListener(Event.COMPLETE, getExams); 
         function getExams(e:Event):void 
          { 
           trace (xmlLoader1.data); 
           var examtxt:TextField = new TextField(); 
           examtxt.width = 260; 
           examtxt.height = 400; 
           examtxt.y = 30; 
           examtxt.x = 30; 
           examtxt.border = true; 
           examtxt.borderColor = 0x000000; 
           examtxt.background = true; 
           examtxt.backgroundColor = 0x888888; 
           examtxt.textColor = 0xFFFFFF; 
           examtxt.text = (xmlLoader1.data); 
           addChild (examtxt); 
          } 
        } 
      } 
    } 
+0

在第一眼看起来像它应该工作,你确认您的http://praxis2.cit.ie/~patrickhallihan/DynamicContent/autumn/getschedule.php?id=2返回正确的东西?此外,不需要两个独立的循环 – BadFeelingAboutThis

+0

我已经摆脱了第二个循环,但它仍然在做同样的事情。是的多数民众赞成在正确的地址为XML它得到它,并显示它,但只有一个最后的索引,所以无论我点击它带回数据,最后一个应该 –

+0

对不起,并不意味着给你的印象第二个循环是一个问题,只是一个通用的编码技巧,这是不必要的。 – BadFeelingAboutThis

回答

0

不知道这是否会解决您的问题(重构您的代码),但它更干净,没有其他函数内部有许多匿名函数。另外你完全不需要第二个循环。

import flash.events.Event; 
import flash.events.MouseEvent; 
import flash.text.TextField; 

var classArray:Array = new Array();  

var xmlLoader:URLLoader = new URLLoader(); 
var xmlReq:URLRequest = new URLRequest("http://praxis2.cit.ie/~patrickhallihan/DynamicContent/autumn/classxml.php"); 

xmlLoader.addEventListener(Event.COMPLETE, getClasses); //add your listeners BEFORE you call load 
xmlLoader.load(xmlReq); 

function getClasses(e:Event):void 
{ 
    var xmlobject:XML = new XML(e.target.data); 
    var classlist:XMLList = xmlobject.classgroup; 

    for (var i:int = 0; i<classlist.length(); i++) 
    { 
     var classname:String = xmlobject.classgroup.classname[i]; 
     var classtxt:TextField = new TextField(); 

     classtxt.width = 70; 
     classtxt.height = 20; 
     classtxt.border = true; 
     classtxt.borderColor = 0x000000; 
     classtxt.background = true; 
     classtxt.backgroundColor = 0x888888; 
     classtxt.textColor = 0xFFFFFF; 
     classtxt.text = "" + classname; 
     addChild (classtxt); 
     classArray[i] = classtxt; 

     classtxt.y = 40 * i; 
     classtxt.x = 125 
     classtxt.addEventListener(MouseEvent.CLICK, gotoSchedule); 
    } 
}  

function getIndexFromTextField(tf:TextField):int { 
    for (var i:int = 0; i < classArray.length; i++) { 
     if (classArray[i] == tf) { 
      return i; 
     } 
    } 
    return -1; 
} 

function gotoSchedule(event:MouseEvent):void 
{ 
    var tf:TextField = event.currentTarget as TextField; 
    removeChild(tf); 

    xmlLoader = new URLLoader(); 
    var xmlReq1:URLRequest = new URLRequest("http://praxis2.cit.ie/~patrickhallihan/DynamicContent/autumn/getschedule.php?id=" + getIndexFromTextField(tf)); 
    xmlLoader.addEventListener(Event.COMPLETE, getExams); 
    xmlLoader.load(xmlReq1); 
} 

function getExams(e:Event):void 
{ 
    trace(xmlLoader.data); 
    var examtxt:TextField = new TextField(); 
    examtxt.width = 260; 
    examtxt.height = 400; 
    examtxt.y = 30; 
    examtxt.x = 30; 
    examtxt.border = true; 
    examtxt.borderColor = 0x000000; 
    examtxt.background = true; 
    examtxt.backgroundColor = 0x888888; 
    examtxt.textColor = 0xFFFFFF; 
    examtxt.text = (xmlLoader.data); 
    addChild(examtxt); 
} 
+0

我得到的最后一个函数 –

+0

未定义的属性xmlLoader1访问我不好,你必须退出函数作为一个全局变量。更新代码 – BadFeelingAboutThis

+0

这对你的问题有帮助吗? – BadFeelingAboutThis