PDA

Просмотр полной версии : Array of XML странно работает


Stop Black PR!
24.03.2007, 02:03
Имеется каталог, разделённый на несколько 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();