天天看点

Flex 3处理数据 访问 XML 数据4

<script src="http://www.cpcasr.cn/ad_js/mm_123.js"></script>

出可以对XML元素与对象赋值外,你也可以通过使用E4X组装与传递XML对象。

下边的例子中,你可以使用prependChild()和appendChild()方法来向XML对象的列表中的前边或后边增减一个属性。类似 的,使用insertChildBefore()方法和insertchildAfter()方法来增加属性在指定的属性之前或之后。要删除元素,使用 delete()方法从XML中移除节点。

<?xml version="1.0" encoding="utf-8"?>

<mx:Application

xmlns:mx="http://www.adobe.com/2006/mxml"

width="500" height="600"

creationComplete="myDataGrid.selectedIndex=0; validateForm();"

>

<mx:Script>

<!--[CDATA[

import mx.controls.Alert;

// Constants

private const SELECTED_ITEM:uint = 0;

private const THE_LIST:uint = 1;

private const BEFORE:uint = 0;

private const AFTER:uint = 1;

// Flag: is the form valid?

[Bindable]

private var formIsValid:Boolean;

// Flag: does a selection exist in the data grid?

[Bindable]

private var selectionExists:Boolean;

// Holds the index of the next item in the

// data grid following the deletion of a book item.

private var newSelectedIndex:int;

// Model: XML structure describing

// some of the books in my collection.

[Bindable]

private var myBooks:XML =

<books>

<book ISBN="1590595181">

<title>Foundation ActionScript Animation: Making Things Move</title>

<author>Keith Peters</author>

<amazonUrl>http://tinyurl.com/npuxt</amazonUrl>

</book>

<book ISBN="1582346194">

<title>Send in the Idiots: Stories from the Other Side of Autism</title>

<author>Kamran Nazeer</author>

<amazonUrl>http://tinyurl.com/lo5ts</amazonUrl>

</book>

</books>

// Add a new book.

private function addBookHandler():void

{

// Create a new XML Object from the form information

var newBook:XML =

<book ISBN={isbnInput.text}>

<title>{titleInput.text}</title>

<author>{authorInput.text}</author>

<amazonUrl>{amazonUrlInput.text}</amazonUrl>

</book>;

// Save the selected book's index so it can be reselected

// in the grid once the new book is added.

var selectedBookIndex:uint = myDataGrid.selectedIndex;

// Does the user want to add the new

// book relative to the selected book in the

// data grid or relative to the list itself?

if (addRelativeTo.selectedIndex == SELECTED_ITEM)

{

// Add the new item relative to the selected item.

var selectedBook:XML = myBooks.book[selectedBookIndex];

// Does the user want to add it before or after

// the selected item?

if (addPosition.selectedIndex == BEFORE)

{

// Add new item before selected item

myBooks = myBooks.insertChildBefore(selectedBook, newBook);

}

else

{

// Add new item after selected item

myBooks = myBooks.insertChildAfter(selectedBook, newBook);

}

}

else

{

// Add the new item relative to the whole list of books.

if (addPosition.selectedIndex == BEFORE)

{

// Add new item at the start of the list.

myBooks = myBooks.prependChild(newBook);

}

else

{

// Add new item at the end of the list.

myBooks = myBooks.appendChild(newBook);

}

}

// Select the previously selected item in the grid

// so the user doesn't lose their position. (If a new book was

// added before the currently selected item, that item's

// new index will be one greater, so select that.)

var newSelectedIndex:uint = (addPosition.selectedIndex == BEFORE) ? selectedBookIndex + 1: selectedBookIndex;

myDataGrid.selectedIndex = newSelectedIndex;

}

// Delete selected book

private function deleteBookHandler():void

{

// Save the currently selected index.

var selectedBookIndex:int = myDataGrid.selectedIndex;

// Delete the currently selected book.

delete (myBooks.book[selectedBookIndex]);

// Reselect the next logical item in the data grid.

newSelectedIndex = (selectedBookIndex==0) ? 0 : selectedBookIndex - 1;

// Change the selected index of the data grid

// at a later frame. See note on changeDataGridIndex()

// method for more details on this workaround.

callLater ( changeDataGridIndex );

}

// This is a workaround for a known issue with

// List-based components where deleting an item

// from the control's dataProvider leaves the

// selectedIndex at an incorrect value. The workaround

// is to reassign the data provider at least a

// frame later and to change the index there.

private function changeDataGridIndex ():void

{

// Reassign the data grid's data provider.

myDataGrid.dataProvider = myBooks.book;

// Set the selected index.

myDataGrid.selectedIndex = newSelectedIndex;

// Validate the form to make sure that there

// is actually a selection (that the grid is

// not empty).

validateForm();

}

// Perform simple form validation.

private function validateForm():void

{

// Is the form valid?

formIsValid =

isbnInput.text != ""

&& titleInput.text != ""

&& authorInput.text != ""

&& amazonUrlInput.text != "";

// Does a selection exist in the data grid?

selectionExists = myDataGrid.selectedIndex != -1;

}

]]-->

</mx:Script>

<!-- User interface -->

<mx:Panel

title="Assigning XML data"

paddingBottom="10" paddingLeft="10" paddingRight="10" paddingTop="10"

>

<!-- List of books -->

<mx:DataGrid

id="myDataGrid"

dataProvider="{myBooks.book}"

change="validateForm();"

>

<mx:columns>

<mx:DataGridColumn dataField="@ISBN" headerText="ISBN" width="85"/>

<mx:DataGridColumn dataField="title" headerText="Title"/>

<mx:DataGridColumn dataField="author" headerText="Author"/>

<mx:DataGridColumn dataField="amazonUrl" headerText="Web site">

<mx:itemRenderer>

<mx:Component>

<mx:LinkButton

label="Visit"

click="navigateToURL(new URLRequest(data.amazonUrl), 'blank');"

/>

</mx:Component>

</mx:itemRenderer>

</mx:DataGridColumn>

</mx:columns>

</mx:DataGrid>

<!-- New book form. Prepopulated with a book for easier testing. -->

<mx:Form width="100%" autoLayout="false">

<mx:FormHeading label="New book details"/>

<mx:FormItem label="ISBN:" width="

100%">

<mx:TextInput

id="isbnInput"

width="100%"

text="1590596196"

change="validateForm();"

/>

</mx:FormItem>

<mx:FormItem label="Title:" width="100%">

<mx:TextInput

id="titleInput"

width="100%"

text="Object Oriented Actionscript for Flash 8"

change="validateForm();"

/>

</mx:FormItem>

<mx:FormItem label="Author:" width="100%">

<mx:TextInput

id="authorInput"

width="100%"

text="Peter Elst"

change="validateForm();"

/>

</mx:FormItem>

<mx:FormItem label="Amazon Url" width="100%">

<mx:TextInput

id="amazonUrlInput"

width="100%"

text="http://tinyurl.com/qxon2"

change="validateForm();"

/>

</mx:FormItem>

</mx:Form>

<mx:TextArea id="deb" width="100%"/>

<mx:ControlBar>

<mx:Button

label="Add book"

click="addBookHandler();"

enabled="{formIsValid}"

/>

<mx:ComboBox id="addPosition" enabled="{formIsValid}">

<mx:String>before</mx:String>

<mx:String>after</mx:String>

</mx:ComboBox>

<mx:ComboBox

id="addRelativeTo"

enabled="{formIsValid}"

>

<mx:String>selected item.</mx:String>

<mx:String>the list.</mx:String>

</mx:ComboBox>

<mx:VRule height="15"/>

<mx:Button

label="Delete book"

click="deleteBookHandler();"

enabled="{selectionExists}"

/>

</mx:ControlBar>

</mx:Panel>

</mx:Application>