![]() |
Загрузка XML etc
Была проблема в теме "Две абсолютно непонятных фигни".
Я выяснил, что происходит такая штука. Если переменная dataNode является переменной класса, то после загрузки в неё XML в методе этого класса loaded, status, да и сама переменная принимают значения undefined. Можно обойти это дело если воспользоваться локальной переменной: Код:
private function loadFromFile(fileName: String) {one three Как бы обойти эту вещь? |
1. Создавать функцию внутри метода не правильно.
2. Пользуйтесь классом mx.utils.Delegate для смены областей видимости внутри событий. Должно получиться примерно так: Код:
import mx.utils.Delegate; |
Спасибо, попробую
|
Ньюанс: переменная node не видна из метода-делегата.
И ещё вопрос. Чем отличается использование этого Delegate от записи типа Код:
node.onLoad = onDataLoad; |
Цитата:
Код:
var node: XML = new XML();Цитата:
|
Я могу вынести node за пределы метода, сделав его переменной класса. ТОгда я вернусь к ситуации, в которой после вызова load происходит не пойми что, свойства loaded и status становятся undefined. Об этом я писал в предыдущей теме.
------------ Хотя щас вот с делагатом вроде адекватно стало всё. Спасибо ещё раз. ------------ Щас пишу код Код:
_notifier = new EventDispatcher();Код:
public function dataLoaded(event: String) {Написал так Код:
_notifier = new EventDispatcher();Пробую. Но говорит, но делегируемая функция теперь в другом классе (раньше она была в Hall, теперь во Viewer), и компилятор ругается на неё. ------------ Я подумал в итоге, что все эти диспатчи. Без них можно. Они только мешают тем, что путают области видимости. А если _parent.dataNode у меня единственный слушатель события, то наверное проще его сразу и вызывать из метода дочернего класса. Я прав?) |
нет... вы сами себя путаете... все гораздо проще.
Код:
import mx.utils.Delegate;Код:
import XMLLoader; |
Не понимаю, что это должно мне доказать.
Тем более, что у меня по сути метод overrideDefaultOnLoad находится в другом классе, поэтому не виден в данной конструкции. |
Цитата:
this в XMLLoader и вo втором примере - это разные объекты - именно та ситуация, которую вы описали. Именно для этого и придуман Delegate. Т.е. как бы вы ни придумывали хитрые схемы по загрузке ХМЛ (я думаю, что если порыться на форуме - их с сотню, наверное, можно будет набрать =) Вам все равно прийдеться прийти к ситуации когда: а. Загружаемый ХМЛ виден из объекта, у которого вы пытаетесь вызвать метод обрабатывающий ХМЛ (фз, звучит, как масло масляное, но, факт, именно так и должно быть =). *метод не обязан быть "родным", можно использовать функцию объявленную в совсем другом месте, но вызвать ее все равно нужно будет именно там, где виден ХМЛ.* либо б. передать ХМЛ методу (тогда уже область видимости не важна). |
Цитата:
Delegate.create (_parent, onLoadDelegate); Это нужно для вызова обработчика сообщений, потому что обрабатывающий метод по логике находится в родительском классе. Но текущий класс не знает о функции onLoadDelegate. Поэтому я решил, что проще вызывать эту функцию напрямую, без заморочек с EventDispatcher и проч. |
| Часовой пояс GMT +4, время: 00:26. |
Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.