![]() |
|
||||||||||
|
|||||||
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | Опции просмотра |
|
![]() |
![]() |
|
|
|
|||||
|
Регистрация: Mar 2007
Сообщений: 46
|
Цитата:
Можешь помочь в моем примере? На скорую руку накропал, несуди плиз строго. Как сделать чтобы мое условие if ... else if работало в функции init? class my {
private var frames:MovieClip;
public function my(str:String) {
this.frames = frames;
var str:String = "hello";
getDaten(str);
}
private function getDaten(str:String) {
var obj:Object = this;
for (var i = 0; i <= str.length; i++) {
var tex = str[i];
if (tex[10] == "up") {
var m_Frame:MovieClip = frame_Up;
} else if (tex[0] == "down") {
var m_Frame:MovieClip = frame_Down;
}
}
obj.init();
}
private function init() {
var frame_Up:MovieClip = this.createEmptyMovieClip("frame", this.getNextHighestDepth());
var frame_Down:MovieClip = this.createEmptyMovieClip("frame", this.getNextHighestDepth());
frames = m_Frame.attachMovie("fr", "fr" + i, m_Frame.getNextHighestDepth());
}
}
|
|
|||||
|
Регистрация: Jan 2008
Сообщений: 669
|
Ой-ё! Я даже не могу понять, что ты хочешь сделать... Ты хочешь передавать в конструктор имя клипа, а потом аттачить его что-ли? Вообщем распиши все по-подробнее на словах.
|
|
|||||
|
Регистрация: Mar 2007
Сообщений: 46
|
извини намудрил конечно...
вот оригинал моей функции private function getXMLDaten(xml_weg:String):Void {
var punkt:Object = this;
var menu_db:Array = new Array();
this.xml.onLoad = function(success:Boolean) {
if (success) {
for (var i = 0; i < this.firstChild.childNodes.length; i++) {
var shortcut = this.firstChild.childNodes[i];
var submenu_db:Array = new Array();
if (shortcut.attributes.ur == "up") {
var m_frame = frame_Up;
} else if (shortcut.attributes.ur == "down") {
var m_frame = frame_Mitte;
}
for (var j = 0; j < shortcut.childNodes.length; j++) {
submenu_db.push({ur:shortcut.childNodes[j].attributes.ur, caption:shortcut.childNodes[j].attributes.name, link:shortcut.childNodes[j].attributes.link});
}
menu_db.push({ur:shortcut.childNodes[j].attributes.ur, caption:shortcut.attributes.name, link:shortcut.attributes.link, subnav_db:submenu_db});
}
punkt.initMenu(menu_db);
}
};
xml.load(xml_weg);
}
как это сделать? |
|
|||||
|
Modus ponens
|
Создавать функции внутри функций - плохо, на то есть много причин.
Есть для этих целей класс mx.utils.Delegate он специально предназначен для делегирования (передачи) объекта в области видимости которого будет выполнена функция этой функции. Кроме того, переделывать ХМЛ в другую структуру, будь то массив или объект - в 99% случаев абсурдное занятие, которое только занимает время и ресурсы. В общем случае, либо используйте так, как есть, либо если очень сложная структура - есть XPath, есть и в mx пакете, и есть альтернативный вариант. Ну и вот это - ну, как бы вообще не серьезно: menu_db.push({ ur:shortcut.childNodes[j].attributes.ur,
caption:shortcut.attributes.name,
link:shortcut.attributes.link,
subnav_db:submenu_db});
Кроме всего прочего, перебирать в цикле ХМЛ таким вот образом: Во-первых нечитаемо, а во вторых создает лишнюю нагрузку, т.е. логично в таком случае поступить так:
__________________
Hell is the possibility of sanity |
|
|||||
|
Регистрация: Mar 2007
Сообщений: 46
|
Спасибо за советы, но у меня пока нет цели оптимезировать.
Цитата:
вот так моя функция функционирует 100% private function getXMLDaten(xml_weg:String):Void {
var punkt:Object = this;
var menu_db:Array = new Array();
var frame_Up:MovieClip;
this.xml.onLoad = function(success:Boolean) {
if (success) {
for (var i = 0; i < this.firstChild.childNodes.length; i++) {
var shortcut:Array = this.firstChild.childNodes[i];
var submenu_db:Array = new Array();
for (var j = 0; j < shortcut.childNodes.length; j++) {
submenu_db.push({ur:shortcut.childNodes[j].attributes.ur, caption:shortcut.childNodes[j].attributes.name, link:shortcut.childNodes[j].attributes.link});
}
menu_db.push({ur:shortcut.attributes.ur, caption:shortcut.attributes.name, link:shortcut.attributes.link, subnav_db:submenu_db});
this.initMenu.apply(this, shortcut);
}
punkt.initMenu(menu_db);
}
};
xml.load(xml_weg);
}
private function initMenu(nav_db:Array, shortcut):Void {
if (shortcut.attributes.ur == "up") {
var m_frame = frame_Up;
trace(shortcut.attributes.ur);
} else if (shortcut.attributes.ur == "down") {
var m_frame = frame_Mitte;
trace(m_frame);
}
var frames:MovieClip = m_Frame.attachMovie("fr", "fr" + i, m_Frame.getNextHighestDepth());
}
P.S. я только учусь и пытаюсь разобраться. |
|
|||||
|
Регистрация: Dec 2007
Сообщений: 69
|
Ты запутался в this'ах, а еще разберись в области видимости функции...
Внутри анонимной функции this'ом является экзепляр xml, а экзепляр объекта punkt внутри данной функции не будет виден. И вообще ЗАЧЕМ ты экзепляру объекта punkt присваиваешь экзепляр класса? В общем решение может быть таким: private var menu_db:Array = new Array();
private var frame_Up:MovieClip;
private var xml:XML;
private function getXMLDaten(xml_weg:String):Void {
xml.onLoad = Proxy.create(this, checkLoadingResult);
xml.load(xml_weg);
}
private function checkLoadingResult():Void {
if(xml.loaded) {
// твой код
initMenu(arr);
}
}
private function initMenu(arr:Array):Void
{
}
class Proxy
{
public static function create(obj:Object, func:Function):Function
{
var arg:Array = arguments.slice(2);
var new_func:Function = function()
{
return func.apply(obj, arg);
};
return new_func;
}
}
В любом случае это "гавнокод", лучше разберись в принципах ООП, а потом пиши код в классах. Последний раз редактировалось XBEEN; 14.08.2008 в 02:41. |
![]() |
![]() |
Часовой пояс GMT +4, время: 22:32. |
|
|
« Предыдущая тема | Следующая тема » |
|
|