Dojo Learning: Dojo.data

来源:互联网 发布:手机淘宝10.0 编辑:程序博客网 时间:2024/04/30 21:41

今天说说dojo的数据模块。dojo提供了一个统一的封装的数据存取API——dojo.data。dojo.data提供了很多store类用来从不同的数据源读取数据并提供用户访问的接口。如处理JSON格式数据的ItemFileReadStore类,处理CSV格式数据的CsvStore类,处理XML格式数据的XmlStore类。这些Store类可以看成是传统数据库中的数据表(data table),而Store中的item则是数据库中的数据行(data row),每个item中的attribute则是数据行中的数据列(data column),Store中的query属性就是数据库中的查询条件了。这些类的使用方法大同小异,下面用 ItemFileReadStore作为例子来具体说明使用方法。

ItemFileReadStore是用来处理JSON数据的,JSON数据是JavaScript Object Notation,是一种轻量级的数据交换格式。它是基于Javascript标准的一个子集,JavaScriptd的数据结构(如字符串、数组、对象)的表示方式恰好与JSON相同,所以JSON可以被Javascript无损的识别。它是一种简单文本格式,与XML相比,它更加易读、更少的数据冗余。

下面定义一段简单的JSON文件:

{

identifier: 'name',

items: [

{ name: 'Adobo', aisle: 'Mexican' },

{ name: 'Balsamic vinegar', aisle: 'Condiments' },

{ name: 'Basil', aisle: 'Spices' },

{ name: 'Bay leaf', aisle: 'Spices' },

{ name: 'Beef Bouillon Granules', aisle: 'Soup' },

{ name: 'Vinegar', aisle: 'Condiments' },

{ name: 'White cooking wine', aisle: 'Condiments' },

{ name: 'Worcestershire Sauce', aisle: 'Condiments' }

] }  

熟悉JavaScipt的朋友应该对这样的代码很熟悉。{}表示定义一个对象,其中定义了两个属性identifier和items。其中identifier的值表示这个数据的主键,而items的值是一个JS的数组,数组的单个值也是一个对象,其中的属性即是数据项。

将这个JSON代码保存成一个文件,如“pantry_spices.json”

然后定义一个处理次JSON数据的ItemFileReadStore对象。与之前用到的Bottom一样,同样有两种定义方式。不管哪种方法,都要先引入必要的dojo文件:

dojo.require("dojo.data.ItemFileReadStore");

第一种方法是在html的body中定义:

<div dojoType="dojo.data.ItemFileReadStore" jsId="pantryStore"
        url="data/pantry_items.json"></div>

很简单,定义div的dojoType和数据源url,jsId则是为了方便JS中调用此对象:定义了jsId,在JS代码中调用此对象就不必使用document.getElementById或dojo.byId那么麻烦,可以直接使用此对象的jsId来调用。

第二种方法是JS编程定义,也很简单。

var pantryStore = new dojo.data.ItemFileReadStore({url: "data/pantry_items.json" } );

这样就定义了一个ItemFileReadStore的对象pantryStore,接着就是从中读取数据。通常使用ItemFileReadStore的fetch方法实现。此方法的参数是一个对象,其中主要包含下列参数:

query:查询条件,格式为一个Object对象,其中属性名为需要满足条件的数据属性名,而属性值为此属性需要满足的查询条件,可支持通配符,”?”,”*”表示一个或多个字符(包含0个)。多个属性则表示多个条件的and关系。

如此例中定义一个query对象:

var queryObj={name:"B*",aisle:"*p*"};

表示查询name中以"B"开头且aisle中包含"P"的数据项。

onBegin:读取开始前调用的方法,传入参数为查询到的item的数量值和request对象

onError:读取出现异常时调用的方法,传入参数为error对象以及request对象。

onItem:读取每个item时调用的方法,传入参数为当前的item对象及request对象。

onComplete:读取结束时调用的方法,传入参数为读取的items数组及request对象。不过使用时发现onComplete如果与onItem同时使用,则传入的items数组为空,不知为何。。。。还需要继续研究,不知是不是dojo的bug。

因此定义一次查询的代码如下:

pantryStore.fetch({ onComplete: gotList, onItem: doOnItem, onError: gotError,query:queryObj});

其中goList,doOnitem,gotError分别是预先定义的处理方法,可根据需要定义。如在读取一个数据项时弹出对话框将此项的name和aisle显示出来,则可定义:

var doOnItem=function(item,request)
{
 
 alert("name:"+pantryStore.getValue(item, "name")+";aisle:"+pantryStore.getValue(item, "aisle"));
}

其中getValue为ItemFileReadStore对象的方法,用来取得item中某个属性的值。其实,不使用此方法,使用item.name[0]也能取得item的name属性值。

除此之外,ItemFileReadStore对象还有很多其他很有用的方法,如getIdentity(item),getAttributes(item)

原创粉丝点击