AS3: Массив объектов, проанализированных из XML, остается с нулевой длиной - PullRequest
1 голос
/ 10 апреля 2010

Я пытаюсь разобрать файл XML и создать массив объектов из его данных.Данные преобразуются в классы MediaAlbum (мой собственный класс).XML анализируется правильно, и объект загружается, но когда я его создаю, массив Albums имеет нулевую длину, даже если данные загружаются правильно.

Я действительно не знаю, в чем проблемамогут быть ... какие-либо подсказки?

import Nem.Media.*;
var mg:MediaGallery = new MediaGallery("test.xml");
trace(mg.Albums.length);

Класс MediaGallery:

package Nem.Media
{
    import flash.net.URLRequest;
    import flash.net.URLLoader;
    import flash.events.*;

    public class MediaGallery
    {
        private var jsonGalleryData:Object;
        public var Albums:Array = new Array();

        public function MediaGallery(xmlSource:String)
        {
            var loader:URLLoader = new URLLoader();
            loader.load(new URLRequest(xmlSource));

            loader.addEventListener(Event.COMPLETE, loadGalleries);
        }

        public function loadGalleries(e:Event):void
        {
            var xmlData:XML = new XML(e.target.data);
            var album;

            for each (album in xmlData.albums)
            {
                Albums.push(new MediaAlbum(album.attribute("name"), album.photos));
            }
        }
    }
}

Источник теста XML:

<gallery>
    <albums>
        <album name="Fútbol 9">
            <photos>
                <photo width="600" height="400" filename="foto1.jpg" />
                <photo width="600" height="400" filename="foto2.jpg" />
                <photo width="600" height="400" filename="foto3.jpg" />
            </photos>
        </album>
        <album name="Fútbol 8">
            <photos>
                <photo width="600" height="400" filename="foto4.jpg" />
                <photo width="600" height="400" filename="foto5.jpg" />
                <photo width="600" height="400" filename="foto6.jpg" />
            </photos>
        </album>
    </albums>
</gallery>

Решено

Добавленофункция обратного вызова для конструктора для обработки данных XML после завершения загрузки.

1 Ответ

2 голосов
/ 10 апреля 2010

Проблема здесь в том, что вы создаете объект MediaGallery, который выполняет синтаксический анализ xml, а затем проверяет размер проанализированных данных, прежде чем они будут готовы. Я бы порекомендовал использовать функцию обратного вызова. Для этого вам нужно только изменить конструктор MediaGallery, как показано на рисунке.

private var callbackObj:Object;

public function MediaGallery(xmlSource:String, callback:Object)
    {
        var loader:URLLoader = new URLLoader();
        loader.load(new URLRequest(xmlSource));

        loader.addEventListener(Event.COMPLETE, loadGalleries);
        this.callbackObj = callback;
    }

Теперь вам нужен метод обновления в классе, который создает экземпляр MediaGallery, например:

public function update():void {
    trace(mg.Albums.length);
}

Наконец, все, что вам нужно сделать, это добавить вызов метода update в ваш обработчик Event.Complete. (Измените его следующим образом).

public function loadGalleries(e:Event):void
    {
        var xmlData:XML = new XML(e.target.data);
        var album;

        for each (album in xmlData.albums)
        {
            Albums.push(new MediaAlbum(album.attribute("name"), album.photos));
        }

        this.callbackObj.update();
    }

Это должно решить вашу проблему :-D Просто помните, что когда вы имеете дело с URLLoader, вам нужно написать свой код, чтобы он управлялся событиями, или вы будете пытаться использовать данные, которые еще не были получены.

Удачи

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