ningwentao 2012-12-30
使用远程XML数据
1.数据来源:嵌入式数据、远程加载数据
2.以Object形式返回数据的HTTPService对象
3.以XML形式返回数据的HTTPService对象
使用E4X(ECMAScriptforXML)表达式搜索XML数据
基于动态XML构建XMLListCollection(将需要的数据放到集合中)
6.将获取到的数据在控件(List、ComboBox、Tree)中进行显示
-----------------------------------------------------------
嵌入式数据(适合不需要经常更新的数据,如省份)
通过source属性将外部文件作为模型的数据来源
<fx:Modelid="groceryInventory"source="assets/inventory.xml"/>
以何种方式使用XML
1.直接使用XML<fx:XML>---E4X
2.将XML转换为对象,再用对象代理XML<fx:Model>
远程数据(将数据与应用程序分离)
HTTPService
HTTPService组件可以让应用程序从给定URL取得数据
默认情况下数据以对象的形式返回,也可以设置以XML形式返回数据
使用HTTPService的步骤:
1.创建HTTPService对象(调用send方法之前请求不会开始)
2.调用对象中的send(),必须通过此方法,程序才会向服务器发起数据请求
3.使用数据(当数据成功返回之后,会触发一个Result事件,在该事件中完成数据处理)
何时向服务器发起请求?
当应用程序启动时便获取数据,通过Application的creationComplete事件处理函数,在函数中调用send
如何访问HTTPService返回的数据:
1.httpServiceID.lastResult属性可以在应用程序的任何地方使用
2.event.result属性只能在事件处理函数中使用
数据访问的安全性
FlashPlayer安全模型的核心是"沙箱"机制
FlashPlayer会把来自不同域的内容放到不同的沙箱中,从一个域加载的内容
不允许访问从另一个域中加载的内容
跨域访问数据
通过跨域策略文件来设置访问权限--crossdomain.xml
这个文件要放在包含被访问数据的Web服务器的根目录下!
内容:
<cross-domain-policy>
<allow-access-fromdomain="www.xxxsite.com"/>
</cross-domain-policy>
允许所有域的访问
<cross-domain-policy>
<allow-access-fromdomain="*"/>
</cross-domain-policy>
XML与XMLList的区别
XML是具有唯一根标签的
XMLList则只包含一组有效XML节点,自身没有根节点,不是有效的XML
E4X运算符
E4X运算的结构都是XMLList类型的数据,即一组有效的XML节点
这些节点中包含的数据就是我们需要的数据
使用E4X搜索XML文件,找到需要的节点,XML是树形结构的,通常需要获取树的一些分支
categroy.product
categroy.product[1]
categroy.product.(unit=="bag")过滤器限制返回数据
categroy.product.(@cost=="1.95")基于节点的属性进行过滤,需要使用@标记
categroy.product.(@cost=="1.95").(unit="each")
categroy..product后代存取器descendantaccessor返回所有符合条件的后代
categroy..product.(@cost>2)
注意:
XML和Object这两种返回的数据格式只是使用XML的不同方式,各有利弊,都有各自适用的场合!
1.XML结合E4X表达式可以快速搜索和操作XML数据,但是任何一个地方录入错误都将导致程序出错
2.使用强类型的对象可以通过提示避免录入错误
HTTPService默认会在取得数据时返回动态的对象而不是XML
可以修改相应属性返回XML,将返回数据保存到XMLListCollection中
在HTTPService中添加resultFormat属性
resultFormat="e4x"这样返回的数据就可以使用E4X运算符来操作XML了
[默认情况下,返回的数据是一个被包装到ObjectProxy实例中的动态代理对象]
返回的数据可以通过event.result.xxx获取到
然后放到一个XMLListCollection中
[Bindable]元标签
告诉Flex监视某个数据的变化,在发生变化事件时,通知所有使用该数据的对象更新数据并刷新显示
eg:
[Bindable]
privatevarcategries:XMLListCollection;
privatefunctionhandleCategoryResult(event:ResultEvent):void{
categories=newXMLListCollection(event.result.category);
}
说明:将需要的数据保存到一个XMLCollection中,方便对数据进行操作
---------------------------------------------------------------
在Flex的List控件中显示远程数据
将获取到的数据放大控件中进行显示
通过dataProvider来指定数据源
通过labelField告诉Flex以哪个字段(属性)作为列表项的标签
<s:ListdataProvider="{categories}"labelField="name">
<s:layout>
<s:HorizontalLayout/>
</s:layout>
</s:List>