Создание собственного глоссария - PullRequest
0 голосов
/ 18 февраля 2010

Я хочу создать пользовательский словарь, который загружает данные из внешнего XML-файла и отображает соответствующее значение.Вот XML-файл

<glossary>
 <alphabet id="A">
  <term heading= "Anchor" definition="A mechanical device that prevents a vessel from moving"/>
  <term heading= "Atlas" definition="A collection of maps in book form"/>
 </alphabet>
 <alphabet id="D">
  <term heading= "Delay" definition="Time during which some action is awaited"/>
 </alphabet>
 <alphabet id="D">
  <term heading= "Risk" definition="A source of danger; a possibility of incurring loss or misfortune"/>
  <term heading= "Rotate" definition="Turn on or around an axis or a center"/>
 </alphabet>
</glossary>

Ниже приведен скрипт.Это должно показать соответствующее определение, когда мы нажимаем на термин:

var xmlLoader:URLLoader= new URLLoader()
xmlLoader.load(new URLRequest("datalist.xml"))
xmlLoader.addEventListener(Event.COMPLETE, xmlLoaded)
var xmlData:XML= new XML()
//This function is called when the XML file is loaded
function xmlLoaded(e:Event):void {

 //Make sure we're not working with a null loader
 if ((e.target as URLLoader) != null ) {
  //Insert the loaded data to our XML variable
  xmlData= new XML(e.target.data)
  xmlData.ignoreWhitespace = true;
  //Call the function that creates the whole menu
  createMenu();
 }
}
function createMenu():void {
 //This will be used to represent a menu item
 var menuItem:MenuItem
 //Counter
 var i:uint = 0;
 //Loop through the links found in the XML file
 for each (var link:XML in xmlData.alphabet.term) {
  menuItem = new MenuItem();
  //Insert the menu text (link.@name reads the link's "name" attribute)
  menuItem.menuLabel.text = link.@heading;
  //If the text is longer than the textfield, autosize so that the text is 
  //treated as left-justified text
  menuItem.menuLabel.autoSize = TextFieldAutoSize.LEFT;
  //Insert the menu button to stage
  menuItem.x = 20;
  menuItem.y = 30 + i*25.3;
  //Make the button look like a button (hand cursor)
  menuItem.buttonMode = true;
  menuItem.mouseChildren = false;
  //Add event handlers (used for animating the buttons)
  menuItem.addEventListener(MouseEvent.MOUSE_DOWN, mouseDownHandler);
  //menuItem.addEventListener(MouseEvent.MOUSE_OUT, mouseOutHandler);
  addChild(menuItem);
  //Increment the menu button counter, so we know how many buttons there are
  i++;
 }
}

function mouseDownHandler(e:Event):void
{
 var trace(xmlData.alphabet.term.@definition)
}

1 Ответ

0 голосов
/ 18 февраля 2010

У вас есть разные способы достичь того, что вы хотите:

1- Вы можете добавить в свой класс MenuItem поле, в котором будет находиться нужное вам определение

public class MenuItem {
 //...
 public var definition:String;
 //...
}
//...
function createMenu():void {
 //This will be used to represent a menu item
 var menuItem:MenuItem
 //Counter
 var i:uint = 0;
 //Loop through the links found in the XML file
 for each (var link:XML in xmlData.alphabet.term) {
  menuItem = new MenuItem();
  //Insert the menu text (link.@name reads the link's "name" attribute)
  menuItem.menuLabel.text = link.@heading;
  menuItem.definition = link.@definition;
 //...
 }
}
//...
function mouseDownHandler(e:Event):void
{
 var mi:MenuItem=e.currentTarget as MenuItem;
 if (mi!==null)
  trace(mi.definition);
}

2 - используйте словарь , который сопоставит заголовок с определением:

//...
import flash.utils.Dictionary;
//...
var maps:Dictionary=new Dictionary(true);
//...
function createMenu():void {
 //This will be used to represent a menu item
 var menuItem:MenuItem
 //Counter
 var i:uint = 0;
 //Loop through the links found in the XML file
 for each (var link:XML in xmlData.alphabet.term) {
  menuItem = new MenuItem();
  //Insert the menu text (link.@name reads the link's "name" attribute)
  menuItem.menuLabel.text = link.@heading;
  maps[menuItem]=link.@definition.toString();
 //...
 }
}
//...
function mouseDownHandler(e:Event):void
{
 var mi:MenuItem=e.currentTarget as MenuItem;
 if (mi!==null)
  trace( maps[mi] );
}

3 - Использование поиска e4x для поиска правильного определения по текстовой метке

//...
function mouseDownHandler(e:Event):void
{
 var mi:MenuItem=e.currentTarget as MenuItem;
 if (mi!==null) {
  var heading:String=mi.menuLabel.text;
  trace( xmlData.alphabet.term.(@heading.toString()==heading).@definition);
 }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...