dojo.data--dojo学习
什么是dojo.data?
dojo.data模块提供了一些数据存储对象,这些对象是可以使用javascript来访问的各种不同类型的数据
源,一个数据源可以是一个简单的数据文件,一个如Yahoo提供的del.icio.us站点提供的Web Service,
或者一个关系数据库或XML数据库。
dojo.data要实现的目标就是有一套标准的数据访问API,和大量遵守这些数据访问API的数据存储结构。
有哪些可以使用的数据存储呢?
截止2007年1月,我们有5种简单的数据存储:
dojo.data.CsvStore:一个只读存储,从.csv格式文件中读取列表格式的数据
dojo.data.OpmlStore:一个只读存储,从.ompl格式文件中读取层次关系的数据
dojo.data.YahooStore:一个只读存储,可以通过Yahoo搜索引擎web service读取搜索结果。
dojo.data.DeliciousStore:一个只读存储,可以从del.icio.us Web service读取bookmarks。
dojo.data.RdfStore:一个读写存储,使用SPARQL与RDF数据服务联系,如:Rhizome RDF应用程序服务器。
dojo.data APIs
所有的dojo数据存储的实施都是符合一个标准的数据访问API集合的,虽然dojo.data.CsvStore与
dojo.data.YahooStore是从完全不同的数据源读取数据,但是它们却提供了完全相同的访问存储中数据
的方法。
dojo.data APIs的基本操作是非常简单的--创建一个Item,删除一个Item,设置一个属性值,取得一个
属性值等,我们把这些操作分到不同的组中,第一段是只读访问方法,第二段是写访问方法,然后是其
他较少使用的如属性,版本,更新提示等。
几个基本数据访问API:
dojo.data.core.Read--10个基本的只读访问方法
dojo.data.core.Write--9个基本的创建数据Item和更新属性值的方法
dojo.data.core.Identity--2个数据存储能唯一识别Item的方法。
术语:
data source --放置原始数据的来源,比如一个.csv文件,它可以是一个文件,一个数据库服务器,一个web服务等
datastore --一个JavaScript 对象,它可以从data source读取数据并可使数据通过dojo.data APIs读取。
dojo.data APIs --数据存储实施的方法的标准集合。dojo.data模块包括了一个APIs集合(Read,Write
等),一个datastore可以实施一个或多个APIs.
internal data representation --一个数据存储用来在内存中缓存数据的专用数据结构(XML DOM
nodes,JSON 对象,数组的数组等)
Item --一个有着属性和属性值的数据项,如:Title:'Alien', Year:1979, Producer:'Ridley Scott'。
attribute --item的一个字段或属性
value --一个item的属性的内容
reference --一个Item的值指向了另一个Item
identity --在一个单datastore中用来唯一识别一个Item的标识符。
query --用来在一个datastore中查询一些符合条件的Item的子集,一个qurey通常是一个字符串,但在
一些datastores中它可能是一个数字或一个date日期,或一个复杂的结构化对象。
相互关系图:
dojo.data的一个目标就是减小一个widget的数据提供者部分的代码,由于我们有了标准的dojo.data
APIs,一个widget作者能够写一个widget并使用dojo.data APIs来绑定数据,并在widget中显示出来。
widget自身的与dojo.data APIs是完全独立的,所以不需要了解数据访问是如何实现的,而且一个
widget可以使用各种各样的datastore。
dojo.data.api
Concept 1: Data access is broken down into separate APIs
dojo.data.api.Read:读取数据Item和其属性
dojo.data.api.Write:创建、删除和更新数据item及其属性
dojo.data.api.Identity:通过Item的标识identifier找到定位一个item
dojo.data.api.Notification:在一个store中的数据Item上发生了change事件时通知监听器listeners.
这些change包括create,delete和update.
Concept 2: All items are operated on through store functions
注意:属性不能通过Item对象来直接访问!
正确的访问方法:
var store = new some.data.Store();
var items;
... //Assume in this time items is now an array populated by a call to store.fetch();
//To iterate over the items and print out the value of a 'foo' attribute, you would do the
following:
for (var i = 0; i < items.length; i++){
var item = items[i];
console.log("For attribute 'foo' value was: [" + store.getValue(item, "foo") + "]");
}
错误的访问方法:
var value = item["foo"];
var value = item.foo;
var value = item.getValue("foo");
使用store的方法来访问Item的属性的原因是可以精简store的内部结构,提高访问效率等!
可以使用store的getFeatures()函数列出其支持的api:
Listing the APIs supported by a datastore
<script type="text/javascript"
djConfig="parseOnLoad: true, isDebug: true"
src="/dojo/dojo/dojo.js"></script>
var store = new some.Datastore();
var features = store.getFeatures();
for(var i in features){
console.log("Store supports feature: " + i);
}
目前dojo.data.ItemFileWriteStore支持4种api:
dojo.data.api.Read
dojo.data.api.Identity
dojo.data.api.Write
dojo.data.api.Notification
dojo.data.ItemFileReadStore支持2种api:
dojo.data.api.Read
dojo.data.api.Identity