Introduction to Databinding
出自OpenFace
第十章 数据绑定介绍
第二部分 教程介绍
目录 |
简介
我们将进一步解释如何在LZX;里进行数据交互.
基础
我们总是使用xml格式把数据绑绽到LZX应用上面。XML的声明不是必须的,但需要有一个根结点。通过<dataset>元素来绑绽数据。例如:10.1 数据绑绽
Example 11.1. Datasets
<canvas height="80" width="500" >
<dataset name="myData">
<myXML>
<person show="simpsons">
<firstName>Homer</firstName>
<lastName>Simpson</lastName>
</person>
<person show="simpsons">
<firstName>Marge</firstName>
<lastName>Simpson</lastName>
</person>
<person show="simpsons">
<firstName>Montgomery</firstName>
<lastName>Burns</lastName>
</person>
</myXML>
</dataset>
<text datapath="myData:/myXML[1]/person[1]/firstName[1]/text()"/>
</canvas>
在上面的例子中,单根元素是myXML。通过<text>标签的datapath属性来绑绽到数据。
Datapaths 使用XPath属性来在XML数据中进行巡航。所以,数据集的名称放在冒号前 mydata:,然后是用斜线(/)分开的节点。方括号提供了一个空间来进入目标兄弟节点。默认为[1],所以在上面的例子中也可以加上[1]。
简单地说。上面的例子表明:"从myXML中得到一个person结点,在从person中得到第一个firstName结点并得到文本",调用text()函数返回结点的内容。
获得Marge的名字,我们可以重写<text>标签如下:
<text datapath="myData:/myXML/person[2]/firstName/text()" />
注意,我已经省略了它们所暗示的" [ 1 ] " 。获得Montgomery的"show"属性,我们可以写:
<text datapath="myData:/myXML/person[3]/@show" />
/text()路径段在datapath属性中不是必须的。
到目前为止,我们使用了<text>标签来和一个单一的datapath连接。如果我们需要显示表格信息,这就意味着每个文本(text)元素都需要自己的datapath,这样写起来就会比较麻烦。我们可以通过给定<view>一个datapath来快速建造一个表格。
Example 10.2. 设置<view>的datapath属性
<canvas height="80" width="500">
<dataset name="myData">
<myXML>
<person show="simpsons">
<firstName>Homer</firstName>
<lastName>Simpson</lastName>
</person>
<person show="simpsons">
<firstName>Marge</firstName>
<lastName>Simpson</lastName>
</person>
<person show="simpsons">
<firstName>Montgomery</firstName>
<lastName>Burns</lastName>
</person>
</myXML>
</dataset>
<view name="rowOfData" datapath="myData:/myXML[1]/person[1]">
<simplelayout axis="y" />
<text datapath="firstName/text()" />
<text datapath="lastName/text()" />
<text datapath="@show" />
</view>
</canvas>
这样,整个rowofData视图的datapath现在变成Homer’s person节点。rowofData 的子元素继承了该节点,从而它们的datapath可以相对地进行引用。
多行数据
上面的例子只使用了单一的 rowofData 节点,下面,我们要使用一组节点。
Example 10.3. 一排结点
<canvas height="80" width="500" >
<dataset name="myData">
<myXML>
<person show="simpsons">
<firstName>Homer</firstName>
<lastName>Simpson</lastName>
</person>
<person show="simpsons">
<firstName>Marge</firstName>
<lastName>Simpson</lastName>
</person>
<person show="simpsons">
<firstName>Montgomery</firstName>
<lastName>Burns</lastName>
</person>
</myXML>
</dataset>
<view name="myTable">
<simplelayout axis="y" />
<view name="rowOfData" datapath="myData:/myXML[1]/person">
<simplelayout axis="x" />
<text datapath="firstName/text()" />
<text datapath="lastName/text()" />
<text datapath="@show" />
</view>
</view>
</canvas>
任何包含datapath属性的标签都进行了重复创建。
注意,由于datapath与视图绑定后,如果数据改变,相应的视图也会跟着改变。
包含数据的方法
到目前为止,我们已经使用了嵌入式数据把xml直接写入文件中。这是非常少使用的静态数据方式,但是包含动态数据则是一个更好的方法。
包含进来的方式? 载入时间 语法
内嵌(embeded) 编译时
<dataset name="myData"> <myXML> </myXML> </dataset>
包含 编译时 <dataset name="myData" src="myXMLDoc.xml"/>
HTTP数据 运行时 <dataset name="myData" request="true" type="http" src="myXMLDoc.xml" />
内嵌数据
内嵌数据是指<dataset>标签内的XML。当OpenLaszlo编译器编译程序时,数据就绑定了。而且在应用程序运行后仍可改变数据。
包含数据
包含数据本质上和内嵌数据是一致的,只不过XML是保存在一个分开的文件里。初始下载量和嵌入数据是相同的。
它是针对文件系统的,所以它可以位于其他的目录。包含数据是静态的。
HTTP数据
远程数据通过HTTP传输的,也就意味着它可以(但不一定要)是动态的。如果它是静态的,那它和包含数据及内嵌数据唯一的不同点就是它是在程序运行后才下载的。”type=”http””属性告诉OpenLaszlo服务器这是一个HTTP请求。可以是GET或POST。
关于客户端请求数据,有几点要注意:
如果数据集(dataset)的”repuest”属性为true,一旦应用程序加载,客户端马上请求数据。
每当查询字符串或数据集的URL改变了(分别使用LzHTTPDataset 对象的setQueryString() 或 setURL() 方法。)客户端也会请求数据。
当调用数据集的 doRequest()方法时,客户端也会请求数据。
上面的表格中,我们引用了本地一个文件(myXMLDoc.xml),但我们需要绝对引用,或者需要请求可以返回XML文档的服务端(PHP,ASP,JSP或 CGI)。我们也可以在<dataset>标签中加这样的查询语句:
<dataset name="myData" src="http://www.myServer.com/cgi-bin/myXMLDoc.cgi?return=addresses"/>
当src属性中包含http://时,就隐含了”type=”http””了。
Datapointers
Datapath及其方便,但如果你需要更多地控制数据,它就变得笨拙了。(Datapath实际上是datapointer的扩展,但它更容易学习,这就是我们为什么先介绍它的原因)。一个DataPointer是一个指向数据集的指针,可以到处移动。它也可以一次只在数据集的一个地方,但你也可以使用多个datapointer,每个datapointer指向数据集的不同地方
Datapointer不像datapath那样和视图绑定,但它们的确在视图结构中某个位置,也就是说它们“了解”父亲和孩子视图。
当你需要以某种方式操作数据时,你可能会用到datapointer;比如,利用前面例子中的数据的相同格式,你可能需要找到所有的在South Park 的人。
第一个selectNext(2)方法首先选择<myXML>节点,然后是Homer的<person>节点。它选择两个是因为我们设置了参数2(否则默认为1)。
另外一个selectNext方法,一旦选择XML节点成功(直到没有节点为止)就返回true。我们使用了一个do…while循环来达到目的,这样对每个<person>节点都可以进行迭代。
We could also have given the <datapointer> onerror and ontimeout event handlers to capture any problems.(我们也可以使用<datapointer>onerror和ontimeout事件管理器来捕捉任何的问题。)

