前面“解析五”中我们已经实现了评论的实际功能,但是目前的评论的内容都是存储在一个变量当中,当我们重新加载该应用时又要重新开始,这个肯定不是我们所希望的。我辛辛苦苦打了这么多字,就这么没了,真当是“挥一挥衣袖,不带走一片云彩”,我们要“雁过留声,人过留名”。所以我们需要立刻上马一个新课题:如何将评论内容给保存下来?
一般来说我们要保存数据的话,要么存到一些文本类文件中去,要么存到数据库中去。数据库相对而言更加的优秀,但是我们这里暂时先舍弃掉,因为它涉及到的东西貌似多了点,所以我们先用文本类文件来试试水。那么文本类文件有什么好选择呢?存到TXT文件中去?也不是不行,不过这个到时候解析啊,移植啊什么的比较麻烦,所以我们优先考虑XML这个比较特殊的文本类文件。(为什么说特殊自己百度)
那么首先我们先建好一个包含数据的XML文件,代码如下:
<?xml version="1.0" encoding="utf-8"?>
<commentList>
<commentItem>
<commentID>1</commentID>
<diaryID>1</diaryID>
<floor>1</floor>
<nickName>cly</nickName>
<reFloor>0</reFloor>
<reNickName></reNickName>
<content>不错</content>
<addTime>2014年5月13日 20:22:14</addTime>
</commentItem>
</commentList>
具体XML的文件格式就自己去搞明白吧。这个看懂应该没问题哦。这里就是要注意个编码用UTF-8,主要为了中文的缘故。
然后将该文件保存至FLEX应用的输出目录,一般都是bin-debug文件夹中。这样我们就有了数据文件,接下来就是围绕这个数据文件做文章啦(文章:还念念不忘我啊,我错了……)
我们的目的就是读出评论和写入评论呢,所以我们主要就是研究下FLEX读写XML文件的内容,这个其实网上找下很多很多,我们先来讨论读,至于写我给学生布置了思考题,但是就反馈情况来说极其不乐观,我想我布置的难了,检讨ING……(但我就是知错不改……^O^)。
我们这里讨论两种读XML的方法,一种是利用FB环境鼠标点点就能实现的,一种呢是挺苦逼的代码模式,男神PK屌丝,屌丝完胜,因为更接地气,我喜欢,学生也只能喜欢了……拉仇恨的话不讲了,进入正题。
方式一:首先不要忘记我们现在是在编辑哪个模块?DiaryModule.mxml。然后在FB中有个“数据”菜单,选择“连接XML……”,然后选“本地文件”(至于另外一个URL暂且放过,养肥再杀),然后我们加载了本地的XML文件后选择节点,如果XML文件内容如上所示,那么节点即为commentItem,同时这个应该是数组,因为后面会有多个Item。这样我们就连接到了该XML文件,最后选择需要显示数据的列表控件,这里是:
<s:List id="commentList" skinClass="net.shangle.skins.CommentListSkin" height="308" width="250" itemRenderer="net.shangle.renderers.CommentListRenderer"
creationComplete="assignCommentListListener()"/>
然后右击该控件,选择“绑定到数据“,然后后面的操作你们明了哦……这就是男神,不多说,不解释!
方式二:代码模式开启,学霸模式开启。这里我们需要用到三个额外的对象,URLRequest、URLLoader和XML及相关。
URLRequest:URLRequest 类可捕获单个 HTTP 请求中的所有信息。URLRequest 对象将传递给 Loader、URLStream 和 URLLoader 类的
load()
方法和其他加载操作,以便启动 URL 下载【官方API解释】URLLoader:URLLoader 对象会先从 URL 中下载所有数据,然后才将数据用于应用程序中的代码。它会发出有关下载进度的通知,通过
bytesLoaded
和bytesTotal
属性以及已调度的事件,可以监视下载进度。【官方API解释】XML:XMLDocument、XMLNode、XMLList、XMLListCollection,在网上查到说现在已经用XMLNode来取代原先的XML对象,但是又从网上查到的很多实例还是使用XML对象来操作,所以这里还是沿用旧的操作,有时间再捣鼓新东西吧。
基本过程用文字描述就是:使用URLRequest对象来指定加载的文件、使用URLLoader对象来加载文件内容、使用XML及相关对象来格式化内容以便用于LIST列表控件的DataProvider。
代码描述如下:
这里使用URLLoader构造函数时直接传入URLRequest对象就相当于一个load的加载过程。同时因为这个过程是异步传输,所以如果直接在这三行代码下面去获取XML内容可能会空,所以我们需要监听URLLoader对象的完成事件,这里就添加了一个事件监听,监听的是COMPLETE事件,指定了一个自定义函数来处理该事件——xmlReadCompleteHandle。该函数的具体代码如下:xmlRequest=new URLRequest("data/commentList.xml"); xmlLoader=new URLLoader(xmlRequest); xmlLoader.addEventListener(Event.COMPLETE,xmlReadCompleteHandle);
这里我们使用了try...catch...模式,因为读取外部文件可能会发生一些意料外的错误,所以我们就捕获到异常,并简单的ALERT出来,方便调试。【补充, 错误代码意义】private function xmlReadCompleteHandle(e:Event):void { try{ commentXML=new XML(xmlLoader.data); dataSource=new XMLListCollection(new XMLList(commentXML.commentItem)); commentList.dataProvider=dataSource.list; xmlLoader.removeEventListener(Event.COMPLETE,xmlReadCompleteHandle); }catch(ex:Error) { Alert.show(ex.message); } }
在这个完成事件监听函数中,我们利用URLLoader的data属性来获取到加载的XML内容,然后用个XML类型的对象commentXML来接受并转换为XML对象。然后通过commentXML对象的commentItem属性(该属性就是XML文件中的一个个ITEM节点名,其中根节点是commentList,下面有多个子节点commentItem)。然后将这些多个子节点转换为XMLList,再到XMLListCollection。然后将这个XMLListCollection的list属性作为list列表控件的dataProvider。
最后移除事件监听。
其实上面的一些代码也是自己摸索调试出来的,也许不是那么的规范,但是我们现在的首要任务是实现它,然后才能去优化它。
【待续】