![]() |
|
||||||||||
|
|||||||
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | Опции просмотра |
|
![]() |
![]() |
|
|||||
|
Подскажите, как в такой ситуации правильно организовать функции, чтобы не было проблем с вложенными функциями и с областями видимости:
class Room { static var xmlName:String = "1.xml"; var xmlDoc:XML; var xml_rootNode:XMLNode; public function parsXML():Void { trace(xml_rootNode); } public function Init():Void { xmlDoc.load(xmlName); // ошибка - обработчик внутри функции. // хотя может и нет - обработчик нужен 1 раз и удаляется после использования // ? xmlDoc.onLoad = function():Void { if (this.status == 0) { trace("Успешно"); xml_rootNode = this.firstChild; // !!!!! ошибка - эта функция "не видна" отсюда parsXML(); } else { trace("Ошибка при чтении xml "+this.status); } }; } public function Room() { xmlDoc = new XML(); } } |
|
|||||
|
Негуру
администратор
Регистрация: Jan 2000
Адрес: Кёнигсберг in Moscow
Сообщений: 21,883
Записей в блоге: 7
|
import mx.utils.Delegate;
class Room {
static var xmlName:String = "1.xml";
var xmlDoc:XML;
var xml_rootNode:XMLNode;
public function parsXML():Void {
trace(xml_rootNode);
}
public function Init():Void {
xmlDoc.load(xmlName);
// ошибка - обработчик внутри функции.
// хотя может и нет - обработчик нужен 1 раз и удаляется после использования
// ?
}
public function Room() {
xmlDoc = new XML();
xmlDoc.onLoad = Delegate.create (this, onLoadXML);
}
private function onLoadXML (success:Boolean):Void
//// this теперь ссылается на экземпляр класса Room
if (success) {
trace("Успешно");
xml_rootNode = xmlDoc.firstChild;
// !!!!! ошибка - эта функция "не видна" отсюда
parsXML();
} else {
trace("Ошибка при чтении xml "+xmlDoc.status);
}
};
}
Последний раз редактировалось iNils; 27.11.2008 в 16:28. |
|
|||||
|
Спасибо большое! Я до этого понятия не имела о Delegate.
|
|
|||||
|
Регистрация: Nov 2008
Адрес: Москва
Сообщений: 52
|
А зачем использовать Delegate, по-моему есть более простой и удобный способ:
|
|
|||||
|
Et cetera
Регистрация: Sep 2002
Сообщений: 30,787
|
faust.d503, это кривой и неудобный способ.
|
|
|||||
|
Регистрация: Nov 2008
Адрес: Москва
Сообщений: 52
|
__etc
Расскажите, чем он кривой и неудобный и чем лучше Delegate. Нет конечно можно подключить дополнительный класс, чтобы повысить вес программы, но зачем. Кстати написать функцию прямо внутри конструктора, тоже вполне логичный способ, если парсер используется один раз. Ибо размножать количество методов и переменных класса пусть, и приватных, не всегда хорошо. |
|
|||||
|
Et cetera
Регистрация: Sep 2002
Сообщений: 30,787
|
Такой обработчик нельзя удалить, он будет висеть в памяти до упора, плюс требует self-ссылки, которая тоже живет в памяти, потому что живет функция.
|
|
|||||
|
Регистрация: Nov 2008
Адрес: Москва
Сообщений: 52
|
Цитата:
|
|
|||||
|
Et cetera
Регистрация: Sep 2002
Сообщений: 30,787
|
Да, но тогда анонимная функция с большой вероятностью останется жить, потому что есть self-ссылка, используемая внутри.
|
![]() |
![]() |
Часовой пояс GMT +4, время: 15:40. |
|
|
« Предыдущая тема | Следующая тема » |
|
|