PDA

Просмотр полной версии : Help! onLoad доступ к данным


Vovsik
12.06.2004, 17:13
Помогите разобраться .
Загружаю данные из файла , после чего получается объект который нужно перегрузить в массив (отфильтровав всякие ненужности) . Все бы вроде ничего ,только вот потом ,необходимо получить доступ к отдельному элементу массива

Огромное спасибо тому кто поможет !!!!!
Сам ,просто задалбался ,перебрал множество вариантов .

function load_main(name_array, url_load) {
cont_obj = new LoadVars(); //объявляем
cont_obj.load(url_load); //грузим
cont_obj.onLoad=function(success) { // onLoad OK!
//перегружаем в массив
for (name_obj in cont_obj) {
if (name_obj != "onLoad") {
name_array.push(cont_obj[name_obj]);
}
}
name_array.reverse(); //реверс массива
return name_array; //возвращаем массив
}
}
aa = new Array();
load_main(aa, "text.txt");
element_array=aa[1]//получам элемент массива

текстовый файл:
main0=водка&main1=пиво&main2=коктель&main3=!!!!!!

Nox Noctis
12.06.2004, 18:34
можно поинтересоваться,
почему массив ты заполняешь только когда данные загрузятся,
а получиьт его элемент пытаешься еще до этого ? :))

для чего вообще онЛоад?
для того чтобы выполнить действия только тогда, когда загрузка завершена. (кстати return там совсершенно ни к чему)

до тех пор пока данные не загрузятся массив не создастся, а до тех пор пока он не создастся оч трудно получить его элемент :))

Vovsik
12.06.2004, 21:55
Текстовый файл получаем локально (для тестирования алгоритма), задумка получать данные с сервера (но это потом) .
Пробовал подругому ,когда данные уже загружены ,в результате такое ощущение ,что к полученному объекту нет доступа . Насчет (return) согласен , я переделал немножко ...

function load_main(name_array, url_load) {
cont_obj = new LoadVars(); //объявляем
cont_obj.load(url_load); //грузим
cont_obj.onLoad=function(success) {
trace(cont_obj.loaded);
}
trace(cont_obj.loaded)
for (name_obj in cont_obj) {
name_array.push(cont_obj[name_obj]);
}
name_array.reverse(); //реверс массива
}
aa = new Array();
load_main(aa, "text.txt");
element_array=aa[1]//получам элемент массива
В первом варианте массив заполнялся
Во втором варианте [0] элемент.

Подскажите в чем ошибка

Vovsik
15.06.2004, 19:11
Есть вот такой пимер ...
Array.prototype.fromFile = function(file) {
this.__proto__.__proto__=LoadVars.prototype
this.load(file);
};

myArray=[]
myArray.fromFile("text.txt")

Не могу разобраться как получить доступ к массиву.
Уже замучился ,постоянно "undefined"

Помогите разобраться HELP!!!!

Елё
15.06.2004, 19:29
Вопрос всеж не совсем понятен

Во первых, как правильно сказал Nox Noctis, даже не смотря на то что файл локальный загрузка мгновенно не происходит. Надо ждать onLoad.
Во вторых ты пихаешь дынные в какой то абстрактный массив, не имеющий никакого отношения к тому что передается в параметрах... Ведь когда вызывается onLoad аргументов наскока я понимаю уже не существует

надо наверное как то так

//frame1
function load_main(name_array, url_load) {
cont_obj = new LoadVars(); //объявляем
cont_obj.load(url_load); //грузим
cont_obj.name_array = name_array;
cont_obj.onLoad=function(success) { // onLoad OK!
//перегружаем в массив
for (name_obj in cont_obj) {
if (name_obj != "onLoad") {
name_array.push(cont_obj[name_obj]);
}
}
name_array.reverse(); //реверс массива
_root.play(); //возвращаем массив
}
}
aa = new Array();
load_main(aa, "text.txt");
stop();
//frame2
element_array=aa[1]//получам элемент массива
stop();

Vovsik
17.06.2004, 00:36
Наверное лучше будет если красную строчку перенести внутрь функции , тогда небудет иерархии и отфультровать ненужный объект при заполнении массива (после заполнения вообще удальть объект LoadVars)

//frame1
function load_main(name_array, url_load) {
cont_obj = new LoadVars();
cont_obj.load(url_load);
cont_obj.onLoad=function(success){
cont_obj.name_array= name_array;
for (name_obj in cont_obj) {
if (name_obj != "onLoad"&&name_obj!="name_array") {
name_array.push(cont_obj[name_obj]);
}
}
name_array.reverse();
_root.play();
}
}
aa = new Array();
load_main(aa, "text.txt");
stop();
//frame2
element_array=aa[1]
stop();

Большое спасибо за помощь Nox Noctis & Елё ,суть проблемы понял ,буду работать дальше :)

Интересно , мы сначала представляем себе абстрактную модель , описываем её как функцию ,задаем ей поведение , в зависимости от ситуации (события) .Разумно предположить ,что и доступ к отдельному елементу можно описать так же ,как абстрактную модель.

Вопрос ,можно ли из этого же кадра получить объект?

Елё
17.06.2004, 16:23
Вопрос ,можно ли из этого же кадра получить объект?
Не очень понял из какого кадра и какой объект...

И мне кажется ты не до конца осознал суть проблемы
Поскольку при переносе стрчки ничего работать не будет

Идея в том, если я правильно себе представляю, то во время выполнения функции onLoad ни cont_obj ни name_array не существует. Поскольку это функция определена в объекте а не в _root. К cont_obj ты можешь поиметь доступ через this (this == cont_obj) а к name_array разве что через _root (_root.name_array)

Nox Noctis
17.06.2004, 16:51
я например не особо понимаю смысл этого кода.
что там за чудеса у тебя с циклами, массивами имён... ЗАЧЕМ? :)

Елё
17.06.2004, 17:05
Вроде в цикле получается массив в котором лежит пиво, водка, ну и другие спиртные напитки ;-)

main0=водка&main1=пиво&main2=коктель&main3=!!!!!!

Vovsik
19.06.2004, 02:37
Хорошо ,объсню подробней.
Задумка вообщем такая , все данные распологаются на сервере т.е. (картинки ,тексты, имена кнопок, инстанс имена и т.д.) . Мне нужно получить данные с сервера, и загрузить их в массив для дальнейшей обработки . Лучшая, на мой взгляд ,реализация в AS ,для получения данных, через объект "LoadVars" .Казалось бы ничего сложного , да не тут то было .Для простоты создаем функцию. В качестве параметров передаем имя массива (в который грузим данные),и URL или CGI (откуда получаем данные) .
Для того чтобы загрузить эти данные создаём объект LoadVars
"cont_obj=new LoadVars()"
После чего получаем данные в созданный объект "cont_obj.load(URL)"
На следующем этапе нужно убедиться что загрузка данных завершена и по завершению загрузки выполнить функцию cont_obj.onLoad=function(success){}
Далее используя FOR...IN, данные из объекта LoadVars перегружаем в массив ,Можно за пределами , можно в ней сделать это, безразницы .Главное чтобы из этого массива можно было ,перемещать , записывать , загружать ... и фиг его знает что ещё можно с этим делать ЗА пределами функций.

Код который был подправлен мной после Елё работает! , но получить элемент массива можно только из второго кадра (Как показал Елё), из первого кадра в любом случае "undefined" т.е. фига с маслом. чё делать не знаю :( (пока сам не доехал )
мне нужно из первого кадра

Dindin
19.06.2004, 15:20
Читай внимательно пост Нокса. И начинай заполнение твоего массива только после загрузки всего объекта. Это можно сделать и в одном кадре.

Елё
19.06.2004, 16:32
Оригинал написал(а) Vovsik Код который был подправлен мной после Елё работает! , но получить элемент массива можно только из второго кадра (Как показал Елё), из первого кадра в любом случае "undefined" т.е. фига с маслом. чё делать не знаю :( (пока сам не доехал )
мне нужно из первого кадра [/B]

Ну ты представь, первый кадр у тебя выполняется 0.03 секунды, а переменная из файла грузится 1 сек при плохой связи. Очень я сомневаюсь что это можно сделать в первом кадре... (функция описанная в первом кадре а вызывающаяся после загрузки не считается)

А почему тебе надо именно в первом?
Я лично вижу только два варианта решения
1. втавить "нулевой" кадр
2. создать отдельный прелоэдер

Елё
19.06.2004, 17:02
3. Воспользоваться передачей параметров до загрузки тут (http://www.vmstudio.com/materials.php?flashvars)

Vovsik
20.06.2004, 02:23
Я всё понял парни .
Попробовал переделать ,убрал _root.play() и все stop() (из первого и второго кадра)
Протестил в дебагере ,получилось ,что елемент из массива получается не сразу а через некоторое время .
Можно даже вычислить через какое промежуток времени рагрузится массив.

Наконец-то дошло.

Я наверно достал вас ...Всем спасибо за помощь!!!

Nox Noctis
20.06.2004, 14:12
Оригинал написал(а) Vovsik
Можно даже вычислитьможно.
но это будет очень приблизительное вычисление, и только частный случай - твоя машина. на другой машине всё скорее всего будет по-другому. так что не надо привязываться жестко ко времени..

Vovsik
20.06.2004, 15:21
С выше сказанным согласен.