Dojo学习笔记——Dojo对象存储


难度:中级 Dojo版本:1.8

为什么使用Dojo对象存储
关注度分离 Separation of concerns是有组织的可控编程的基本方面,在网页应用中一个基本的分离就是数据模型从用户界面分离(用户界面一般定义为视图和控制器,在模型-视图-控制器 MVC架构中)。Dojo对象存储架构为数据交互建立了一致性接口,是受到HTML5对象存储API的启发。该API致力于促进松耦合的开发,不同的部件和用户界面可以以一致的方式对来自各种来源的数据进行交互。
Dojo对象存储接口允许开发和使用高度封装的组件,可以容易的连接各种数据来源。存储包括简单的内存存储, JSON/REST存储,遗留的 dojo.data存储和提供附加功能的存储包装器。

开始
最简单的存储是 dojo/store/Memory。可以简单给构造函数提供一个对象数组,一旦存储被创建,可以使用 query方法查询。一种简单的查询方式是提供一个带有名称/值对的对象,表明匹配的对象所需的值。 query方法总是返回一个对象或是带有方法的数组(也包括 mapfilter):
require(["dojo/store/Memory"],
function(Memory){
var employees = [
{name:"Jim", department:"accounting"},
{name:"Bill", department:"engineering"},
{name:"Mike", department:"sales"},
{name:"John", department:"sales"}
];
var employeeStore = new Memory({data:employees, idProperty: "name"});
employeeStore.query({department:"sales"}).forEach(function(employee){
// this is called for each employee in the sales department
alert(employee.name);
});
});
这将调用一个销售部门雇员名称的警告信息。

可以继续在存储中创建新的对象和删除对象:
// add a new employee
employeeStore.add({name:"George", department:"accounting"});
// remove Bill
employeeStore.remove("Bill");
可以获取对象和更新它们。在存储中的对象是简单的JavaScript对象,可以直接访问和修改其性质(当修改性质时,必须使用 put()保存其变化):
// retrieve object with the name "Jim"
var jim = employeeStore.get("Jim");
// show the department property
console.log("Jim's department is " + jim.department);
// iterate through all the properties of jim:
for(var i in jim){
console.log(i, "=", jim[i]);
}
// update his department
jim.department = "engineering";
// and store the change
employeeStore.put(jim);
可以添加额外的参数来查询,这些参数允许将查询限制在特定数量的对象,或是使用 query方法的第二个参数排序对象。第二个参数可以是一个带有 startcount性质的对象,定义了返回对象数量的限制。限制结果集对使用大规模数据集的具有分页功能的小部件(如 grid)至关重要,其中新页面的数据根据需要来请求。第二个参数也可以包括 sort性质,在查询中指定排序的性质和和方向:
employeeStore.query({department:"sales"}, {
sort:[{attribute:"department", descending: false}],
start: 0,
count: 10
}).map(function(employee){
// the results should be sorted by department, with a limit of 10 objects,
// starting at an offset of 0
return employee.name; // return just the name, mapping to an array of names
}).forEach(function(employeeName){
console.log(employeeName);
});
内存存储是同步存储,意味着直接返回一个动作的结果( get返回对象)。

dojo/store/JsonRest
JsonRest存储委托不同的对服务器的存储操作,使用基于标准的 HTTP/RESTJSON。存储操作直观的映射到 HTTP GET, PUT, POSTDELETE方法。
这也是一个异步存储的例子,在异步存储上的方法返回 promises。可以通过提供一个返回 promise的回调使用 promise
require(["dojo/store/JsonRest"],
function(JsonRest){
employeeStore = new JsonRest({target:"/Employee/"});
employeeStore.get("Bill").then(function(bill){
// called once Bill was retrieved
});
});
也可以使用 Deferred.when()(经由 dojo/_base/Deferred模块)和可能是同步或是异步的方法作用,不计实现作为一致的行为。
这些例子演示了如何与存储交互。现在可以开始创建小部件和组件在某种程度上和存储交互,而不依赖特别的实现。也可以将自定义存储插入到已存在的使用存储的组件中。
例如, StoreSeries适配器允许使用存储作为图表的数据源。大多数使用存储的组件需要提供一个查询,组件应当使用其查询存储:
// Note that while the Default plot2d module is not used explicitly, it needs to
// be loaded to be able to create a Chart when no other plot is specified.
require(["dojox/charting/Chart", "dojox/charting/StoreSeries" /*, other deps */,
"dojox/charting/plot2d/Default"],
function(Chart, StoreSeries /*, other deps */){
/* create stockStore here... */
new Chart("lines").
/* any other config of chart */
// now use a data series from my store
addSeries("Price", new StoreSeries(
stockStore, {query: {sector:"technology"}}, "price")).
render();
});
Dojo存储架构中另一个重要概念是通过分层存储包装组合功能。Dojo提供了一些添加功能的存储包装,包括缓冲包装和触发数据变化事件的可观察包装。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值