Вызов метода в пользовательском классе XML возвращает ноль - PullRequest
0 голосов
/ 08 сентября 2011

Я пытаюсь вызвать метод, который имеет некоторые функциональные возможности XML, и он продолжает обнуляться.То, что я пытаюсь сделать, это;У меня есть страница с четырьмя динамическими текстовыми полями, которые получают свое содержимое из XML-файла.Я хотел бы создать метод, который будет выводить содержимое для отображения в динамическом поле.Может быть, мой подход не подходит, но мой супервайзер хочет, чтобы все связанные с XML задачи были в файле xml.as.*

menu.xml

<?xml version="1.0"?>
    <course title="Test Course">
        <folder name="Question 1" link="1_1.swf"/>
   <folder name="Question 2" link="1_2.swf"/>
   <folder name="Question 3" link="1_3.swf"/>
   <folder name="Question 4" link="1_4.swf"/>
   <folder name="Question 5" link="1_5.swf"/>
   <folder name="Question 6" link="1_6.swf"/>
   <folder name="Question 7" link="1_7.swf"/>
   <folder name="Question 8" link="1_8.swf"/>
   <folder name="Question 9" link="1_9.swf"/>
   <folder name="Question 10" link="1_10.swf"/>
    </course>

1 Ответ

1 голос
/ 08 сентября 2011

Попробуйте вместо этого:

Main.as (класс документа):

package 
{
    import com.example.CourseXML;
    import flash.display.Sprite;
    import flash.events.Event;

    public class Main extends Sprite 
    {
        public function Main():void 
        {
            if (stage) init();
            else addEventListener(Event.ADDED_TO_STAGE, init);

        }// end function

        private function init(e:Event = null):void 
        {
            removeEventListener(Event.ADDED_TO_STAGE, init);

            var courseXml:CourseXML = new CourseXML("xml/course.xml");
            courseXml.addEventListener(CourseXML.LOAD_COMPLETE, onCourseXmlLoadComplete);
            trace(courseXml.title)// output: null

        }// end function

        private function onCourseXmlLoadComplete(e:Event):void
        {
            var courseXml:CourseXML = CourseXML(e.target);
            trace(courseXml.title) // output: Test Course

        }// end function

    }// end class

}// end package

CouseXML.as

package com.example 
{
    import flash.events.Event;
    import flash.events.EventDispatcher;
    import flash.net.URLLoader;
    import flash.net.URLRequest;

    public class CourseXML extends EventDispatcher
    {
        public static const LOAD_COMPLETE:String = "loadComplete";

        private var _urlLoader:URLLoader;
        private var _xml:XML;

        public function get title():String 
        {
            var title:String;

            try 
            {
                title = _xml.@title; 
            }
            catch (e:TypeError)
            {
                title = null;

            }// end catch

            return title;

        }// end function

        public function CourseXML(url:String) 
        {
            _urlLoader = new URLLoader();
            _urlLoader.addEventListener(Event.COMPLETE, onUrlLoaderComplete);
            _urlLoader.load(new URLRequest(url));

        }// end function

        private function onUrlLoaderComplete(e:Event):void
        {
            _xml = XML(URLLoader(e.target).data);

            dispatchEvent(new Event(CourseXML.LOAD_COMPLETE));

        }// end function

    }// end class

}// end package

Если вам интересно узнать о try и catch в методе получения title() объекта CourseXML, я поставлю это так, если вы попытаетесь получить доступ к любому из членов свойства _xml до того, как файл xml будет загружен и назначен на него, вы не получите неприятный TypeError.

[UPDATE]

Подумав, попытка и отлов не потребуются, было бы проще использовать условное выражение, подобное следующему:

public function get title():String 
{
    return (_xml) ? _xml.@title : null;

}// end function
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...