![]() |
|
||||||||||
|
|||||
|
Регистрация: Apr 2008
Сообщений: 82
|
Была проблема в теме "Две абсолютно непонятных фигни".
Я выяснил, что происходит такая штука. Если переменная dataNode является переменной класса, то после загрузки в неё XML в методе этого класса loaded, status, да и сама переменная принимают значения undefined. Можно обойти это дело если воспользоваться локальной переменной: private function loadFromFile(fileName: String) {
var node: XML = new XML();
node.ignoreWhite = true;
node.onLoad = function(success) {
dataNode = node; //не знаю стоит ли писать тут dataNode = node.cloneNode(true);
trace('one..');
loadDatas();
trace('thre..');
notifier.dispatchEvent("dataLoaded", _parent);
}
}
private function loadDatas() {
trace('two..');
.......
}
one three Как бы обойти эту вещь? |
|
|||||
|
Негуру
администратор
Регистрация: Jan 2000
Адрес: Кёнигсберг in Moscow
Сообщений: 21,884
Записей в блоге: 7
|
1. Создавать функцию внутри метода не правильно.
2. Пользуйтесь классом mx.utils.Delegate для смены областей видимости внутри событий. Должно получиться примерно так: import mx.utils.Delegate;
...
class ...
private function loadFromFile(fileName: String) {
var node: XML = new XML();
node.ignoreWhite = true;
node.onLoad = Delegate.create (this, loadDatas);
}
private function loadDatas() {dataNode = node;
//не знаю стоит ли писать тут dataNode = node.cloneNode(true);
trace('one..');
trace('two..');
.......
trace('thre..');
notifier.dispatchEvent("dataLoaded", _parent);
}
|
|
|||||
|
Регистрация: Apr 2008
Сообщений: 82
|
Спасибо, попробую
|
|
|||||
|
Регистрация: Apr 2008
Сообщений: 82
|
Ньюанс: переменная node не видна из метода-делегата.
И ещё вопрос. Чем отличается использование этого Delegate от записи типа Последний раз редактировалось Ruffus; 11.06.2008 в 11:41. |
|
|||||
|
Негуру
администратор
Регистрация: Jan 2000
Адрес: Кёнигсберг in Moscow
Сообщений: 21,884
Записей в блоге: 7
|
Цитата:
за пределы метода. Внутри метода описывайте только временные переменные. И не называйте ее node, назовите xml. Имя node должно быть у объектов класса XMLNode, а так вы и себя и других запутаете. В такой записи this будет указывать на XML, и достучаться до самого объекта, который загрузил XML вы не сможите. Поэтому нужно сохранить область видимости неизменной, что и делает Delegate. Тогда внутри onDataLoad, this будет ссылаться на экземпляр класса, а доступ к XML будет осуществляться через node. |
|
|||||
|
Регистрация: Apr 2008
Сообщений: 82
|
Я могу вынести node за пределы метода, сделав его переменной класса. ТОгда я вернусь к ситуации, в которой после вызова load происходит не пойми что, свойства loaded и status становятся undefined. Об этом я писал в предыдущей теме.
------------ Хотя щас вот с делагатом вроде адекватно стало всё. Спасибо ещё раз. ------------ Щас пишу код _notifier = new EventDispatcher();
_notifier.addEventListener("dataLoaded", _parent);
private function onDataLoad(success:Boolean) {
loadDatas();
trace('333');
_notifier.dispatchEvent("dataLoaded");
trace('555');
}
public function dataLoaded(event: String) {
trace("dispatched!");
prepare();
_needProcessing = true;
paint();
}
Написал так _notifier = new EventDispatcher();
_notifier.addEventListener("loaded", _parent);
private function onDataLoad(success:Boolean) {
loadDatas();
trace('333');
_notifier.dispatchEvent({target: this, type: loaded});
trace('555');
}
Пробую. Но говорит, но делегируемая функция теперь в другом классе (раньше она была в Hall, теперь во Viewer), и компилятор ругается на неё. ------------ Я подумал в итоге, что все эти диспатчи. Без них можно. Они только мешают тем, что путают области видимости. А если _parent.dataNode у меня единственный слушатель события, то наверное проще его сразу и вызывать из метода дочернего класса. Я прав?) Последний раз редактировалось iNils; 11.06.2008 в 22:24. |
|
|||||
|
Modus ponens
|
нет... вы сами себя путаете... все гораздо проще.
import mx.utils.Delegate;
class XMLLoader extends XML {
public function XMLLoader(s:String)
{
super(s);
ignoreWhite = true;
onLoad = onLoadDelegate;
//onLoad = Delegate.create (this, onLoadDelegate);
//будет работать одинаково, область видимости та же
}
public function onLoadDelegate(b:Boolean):Void
{
if (b) {
trace(toString());
} else {
trace('error!');
}
}
}
__________________
Hell is the possibility of sanity Последний раз редактировалось wvxvw; 11.06.2008 в 22:36. |
|
|||||
|
Регистрация: Apr 2008
Сообщений: 82
|
Не понимаю, что это должно мне доказать.
Тем более, что у меня по сути метод overrideDefaultOnLoad находится в другом классе, поэтому не виден в данной конструкции. |
|
|||||
|
Modus ponens
|
Цитата:
this в XMLLoader и вo втором примере - это разные объекты - именно та ситуация, которую вы описали. Именно для этого и придуман Delegate. Т.е. как бы вы ни придумывали хитрые схемы по загрузке ХМЛ (я думаю, что если порыться на форуме - их с сотню, наверное, можно будет набрать =) Вам все равно прийдеться прийти к ситуации когда: а. Загружаемый ХМЛ виден из объекта, у которого вы пытаетесь вызвать метод обрабатывающий ХМЛ (фз, звучит, как масло масляное, но, факт, именно так и должно быть =). *метод не обязан быть "родным", можно использовать функцию объявленную в совсем другом месте, но вызвать ее все равно нужно будет именно там, где виден ХМЛ.* либо б. передать ХМЛ методу (тогда уже область видимости не важна).
__________________
Hell is the possibility of sanity Последний раз редактировалось wvxvw; 12.06.2008 в 03:41. |
|
|||||
|
Регистрация: Apr 2008
Сообщений: 82
|
Цитата:
Delegate.create (_parent, onLoadDelegate); Это нужно для вызова обработчика сообщений, потому что обрабатывающий метод по логике находится в родительском классе. Но текущий класс не знает о функции onLoadDelegate. Поэтому я решил, что проще вызывать эту функцию напрямую, без заморочек с EventDispatcher и проч. |
![]() |
![]() |
Часовой пояс GMT +4, время: 16:06. |
|
|
« Предыдущая тема | Следующая тема » |
|
|