Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 1.0/2.0 (http://www.flasher.ru/forum/forumdisplay.php?f=93)
-   -   Array of XML странно работает (http://www.flasher.ru/forum/showthread.php?t=93567)

Stop Black PR! 24.03.2007 02:03

Array of XML странно работает
 
Имеется каталог, разделённый на несколько XML по производителям. Сначала грузится XML с именами производителей и названиями категорий для каждого из них, потом соответствующие XML для каждого производителя.

Первый примитивный вариант успешно работает:

Код:

var ref = this;
System.useCodepage = true;
parseXML1 = new XML();
parseXML1.ignoreWhite = true;
parseXML1.onLoad = function(success:Boolean) {
        if (success) {
                _global.vendors[1].products = new Object();
                _global.vendors[1].products = parseXML1.makeObj();
        } else {
                trace("Error!");
        }
        delete ref.parseXML;
};
parseXML2 = new XML();
parseXML2.ignoreWhite = true;
parseXML2.onLoad = function(success:Boolean) {
        if (success) {
                _global.vendors[2].products = new Object();
                _global.vendors[2].products = parseXML2.makeObj();
        } else {
                trace("Error!");
        }
        delete ref.parseXML;
};
parseXML2.load("content/adamand.xml");
parseXML1.load("content/agates.xml");
stop();

второй вариант, с помещением каждого вендора в отдельную ячейку работает наполовину:

Код:

var ref = this;
System.useCodepage = true;
parseXML = new Array();
for (i=1; i<vendors.length; i++) {
        ref.parseXML[i] = new XML();
        ref.parseXML[i].ignoreWhite = true;
        ref.parseXML[i].onLoad = function(success:Boolean) {
                if (success) {
                        _global.vendors[i].products = new Object();
                        _global.vendors[i].products = ref.parseXML[i].makeObj();
                } else {
                        trace("Error!");
                }
                delete ref.parseXML[i];
        };
        ref.parseXML[i].load("content/"+vendors[i].cat+".xml");
}
stop();

а работает он так: загрузка каждого вендора успешно происходит, массив из XML формируется и его можно посмотреть, а вот ref.parseXML[i] оказывается undefined. Хотя тот же код с обычной переменной работал.

XML-файлы совсем маленькие, общий объём 6кБ

в чём проблема - неясно

необходимость в массиве, элементы которого динамически удаляются по мере парсинга была связана с тем, что элементы по идее загружаются и парсятся независимо, асинхронно. И если применить в качестве промежуточного единственный объект, то возникаеть необходиомость в перекрёстных ссылках с функции обработки события загрузки на функцию загрузки нового вендора. А от рекурсии я стараюсь избавляться по возможности, учитывая ограничения во флеше.

screamge 24.03.2007 02:13

Код:


ref.parseXML[i].load("content/"+vendors[i].cat+".xml");

trace (i)


цикл for там не работает

Stop Black PR! 24.03.2007 02:40

Код:

<vendors>
        <v cat="all" name="Все заводы" />
        <v cat="agates" name="Агатес" />
        <v cat="adamand" name="Адаманд" />
        <v cat="adamas" name="Адамас" />
</vendors>

сначала грузится вот это, а потом по длине списка вендоров идёт цикл

trace(i) даёт 1 2 3

Fann 24.03.2007 18:55

внутри ref.parseXML[i].onLoad ref.parseXML[i] это this попробуй поменять. и с i внутри onLoad поаккуратней )

Stop Black PR! 24.03.2007 19:05

спасибо, постоянно натыкался на это с присвоением обработки событий для кнопок в цикле, а здесь не заметил подвоха :)

привожу работающий вариант:

Код:

var ref = this;
System.useCodepage = true;
parseXML = new Array();
for (i=1; i<vendors.length; i++) {
        ref.parseXML[i] = new XML();
        ref.parseXML[i].ignoreWhite = true;
        ref.parseXML[i].num = i;
        ref.parseXML[i].onLoad = function(success:Boolean) {
                if (success) {
                        _global.vendors[this.num].products = new Object();
                        _global.vendors[this.num].products = this.makeObj();
                } else {
                        trace("Error!");
                }
                delete this;
        };
        ref.parseXML[i].load("content/"+vendors[i].cat+".xml");
}
stop();



Часовой пояс GMT +4, время: 08:39.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.