Flash + AS2.0 =コンストラクターでXMLファイルをロード
-
07-07-2019 - |
質問
コンストラクタを使用してXMLを読み込むには、配列に解析する必要があり、カスタムクラス Menu
を使用します。
ここに私のコードがあります:
class Menu {
// XML file's filename
private var xmlFile:String = "menu.xml";
private var menu:XML;
private var menuArray:Array;
private var mainmenu:Array;
function Menu() {
menu = new XML();
menu.ignoreWhite = true;
menu.load(xmlFile);
menu.onLoad = function(success : Boolean) : Void {
if (success) {
// determine how many chambers there are now
menuArray = menu.firstChild.childNodes;
var length:Number = menuArray.length;
trace(length);
// dynamic according to number of chambers
for (var i:Number = 0; i < length; i++) {
var sublength:Number = menuArray[i].childNodes.length;
var submenu:Array = new Array();
// chamber name and link
var xmlNode:XMLNode = menuArray[i];
submenu["name"] = xmlNode.attributes.name;
submenu["link"] = xmlNode.attributes.link;
// create sub-item for each chamber
for (var j:Number = 0; j < sublength; j++) {
var subXmlNode:XMLNode = xmlNode.childNodes[j];
var item:Array = new Array(subXmlNode.firstChild, subXmlNode.attributes.link);
submenu.push(item);
}
// create an entry for each chamber
mainmenu.push(submenu);
}
}
}
}
function buildMenu():Void {
//trace(mainmenu);
}
}
しかし、残念ながら、何もロードされません。
解決
コンストラクター内で関数を作成するのではなく、ロードハンドラーをクラスのメソッドにして、そのメソッドに等しいmenu.onLoadを割り当てます。そうでなければ、実際の問題は見られませんが、そのハンドラーをトリガーできるメソッドを呼び出す前にイベントハンドラーを宣言する傾向があります(つまり、loadを呼び出す前にonLoadをセットアップします)。また、onDataを追加して、ロードから生データを取得しているかどうかを確認することもできます(onDataは1つの引数-ロードされたファイルの生テキストを受け取ります)。
他のヒント
メインメニュー配列を作成しているとは思わない。コードを次のように修正できます。
menu = new XML();
menu.ignoreWhite = true;
menu.load(xmlFile);
mainmenu = new Array();//add this
所属していません StackOverflow