dojo.data规范了四个特性: 读特性(reading), 写特性(writing),标识特性(identifying), 通知特性(notifying)。每一个数据驱动类都要实现一个或者多个特性。数据存储器是数据驱动类的一个实例,它用来从数据源获取数据。使用dojo.data需要以下四步:
1 选择一个小部件
2 根据小部件选择合适的数据驱动类
3 声明式或者编程式的创建数据存储器
4 将数据存储器挂载在小部件上
下面是dojo.data的架构
dojo.data中的数据驱动类:
一些术语:
所有特性以及一般方法
、
驱动类实现的特性
本文链接
dojo中使用dojo.declare来定义类,它有如下三个参数:
className: 表示类名(即构造函数)的字符串,通常会在全局空间创建这个类,也可以将类名用点分割,如: "myNamespace.Shape",那么Shape就会最为对象myNamespace的属性,如果myNamespace不存在,那么myNamespace.Shapde就会作为全局空间的属性。
superclass: 可选项(null, 函数或者函数数组),指明这个类的父类或者要聚合的类。
props: 一个包含了属性的对象自变量,用来初始化类的原型。如果这个对象自变量中含有一个叫constructor的函数,那么这个函数用来初始化对象实例,叫做初始化函数。
下面用它来创建一个Shape类:
dojo.declare("Shape", null, {color: 0, setColor: function(color) {this.color = color;}});
创建一个Shape对象: var s = new Shpae();
Shape类包含下面属性:
superclass:指向父类原型,如果没有就为undefined。
mixin: 指向聚合类的原型,如果没有就为undefiened。
extend: 一个高级应用,下面要讲。
_constructor: 指向类的初始化函数,这个函数负责构造所有的实例属性,当创建新对象时,有构造函数自动调用。
declaredClass: 就是传给dojo.declare的第一个参数。
inherited: 指向一个用于调用父类方法的函数
使用单继承定义类
为了是子类继承父类,只要将dojo.declare的第二个参数设置为父类的构造函数就可以了:
dojo.declare("Circle", Shape, {
radius: 0;
/*名为constructor的函数来初始化新实例,再调用构造函数的时候被自动调用*/
constructor: function(radius) {
this.radius = radius || 0;
},
setRadius: function(radius) {
this.radius = radius;
}
});
当创建一个Circle对象时,dojo会做两件事:
1 调用父类构造函数
2 调用子类自身的初始化函数
/*调用父类构造函数*/
Shape.apply(this, arguments);
/*调用子类初始化函数*/
this._constructor.apply(this, arguments);
Circle类的原型会指向Shape的原型。
重载父类的方法
子类通常会覆写父类的方法,而且还会在覆写的方法中调用父类的方法,可以通过inherited方法实现这个操作。
dojo.declare("Circle", Shape, {
radius: 0;
/*名为constructor的函数来初始化新实例,再调用构造函数的时候被自动调用*/
constructor: function(radius) {
this.radius = radius || 0;
},
setRadius: function(radius) {
this.radius = radius;
},
/*覆写父类中的setColor方法*/
setColor: function(color) {
if (color > 100) {
this.inherited(arguments); //调用父类中的版本
}
}
});
inherited会找到父类中的方法,然后通过下面的形式调用:
2. // crack arguments
3. if(typeof args == "string"){
4. name = args;
5. args = a;
6. a = func;
7. }
8. // find method f
9. ……
10. if(f){
11. return a === true ? f : f.apply(this, a || args);
12. }
13.}
inherited接受三个参数:
methodName: 要调用的方法名,可选。
args: 即arguments字面量,必选
a: 额外的参数数组,若有这个参数,父类中的方法就不接受arguments字面量。可选
向父类添加方法
向由dojio.declare创建的类的原型中添加方法,应该调用类自带的extend方法,而向其他非dojo.declare创建的构造函数原型中添加方法,调用dojo.extend.
聚合与多继承
dojo.declare可以模拟多继承,这是以聚合的方式实现的。比如现在有一个Circle类,有
一个朋友在某公司为某国企教育机构做网络课程。她的任务是做一些前端页面的工作,但做网络课程的要求是table布局,且得考虑ie6、7、8,不允许用jquery等框架。要知道ie是不支持className取标签的啊,如果要通过className获取标签怎么办啊。你可以通过这个方法:
tagName=tagName||"*"; //此代码的目的是,参数tagName可以不写。
if (document.getElementsByClassName) { //如果浏览器支持getElementsByClassName,就直接的用
return getElementsByClassName(className);
}else {
var tag= document.getElementsByTagName(tagName); //获取指定元素
var tagAll = []; //用于存储符合条件的元素
for (var i = 0; i < tag.length; i++) { //遍历获得的元素
for(var j=0,n=tag[i].className.split(' ');j<n.length;j++){ //遍历此元素中所有class的值,如果包含指定的类名,就赋值给tagnameAll
if(n[j]==className){
tagAll.push(tag[i]);
break;
}
}
}
return tagAll;
}
}
记得我大学的网站还是table满天飞呢。互联网贫瘠的地方恰恰是国企、ZF部门,一直很纳闷几大国有银行的网银为什么只有ie内核的浏览器才能登陆、支付。或许他们有他们的原因,我现在的知识面太小了,需要学习的东西太多太多。
本文链接