dataServices Class
数据服务管理;定义了数据服务的接口和通用操作方法;不能直接使用,必须创建具体类型的数据服务; 数据服务的定义就比较广了,可以是具体的对象方式locaStorage,IndexDB,或者是一些行为ajax,comet,websocket;也可以是根据业务规则定义的rest,cache等;
Constructor
dataServices
dataServices
()
Example:
//cache数组
var _cache = [];
//注册cache的数据服务
st.dataServices.add("cache", {
//实现search接口方法
search: function(op) {
var result, filter = op.filter;
//过滤数据
result = filter ? _cache.filter(filter) : _cache;
//执行成功之后的方法
op.success && op.success(result);
},
//实现update接口方法
update: function(op) {
var filter = op.filter,
//测试使用,只更新第一条匹配数据
data = st.isArray(data) ? data[0] : data;
if (filter) {
//查找数据进行更新
st.each(_cache, function(i, item) {
if (filter(item)) {
_cache[i] = data;
return false;
}
})
} else {
_cache = op.data || [];
}
op.success && op.success(op.data);
}
});
//更新cache的数据
st.dataServices.update({
dsType: 'cache',
data: [{
name: 'user1',
age: 20
}, {
name: 'user2',
age: 30
}],
success: function(result) {
expect(_cache.length).toBe(2);
}
});
//查询server的数据
st.dataServices.search({
dsType: 'cache',
filter : function(data){
return data.name === 'user1'
},
success: function(result) {
expect(result.length).toBe(1);
expect(result[0].age).toBe(20);
}
});
Methods
add
add
(
-
name
-
item
-
[parent]
)
Object | Klass
添加产品方法,注册到factory中
Parameters:
name | type | flag | description |
---|---|---|---|
name
| String | 产品名称 | |
item
| Object | 产品特性 | |
[parent] |
String | optional | 父类名称,注册到factory中产品名称 |
Returns:
[Object | Klass]
返回创建的产品
Example:
//widget基类
var baseWidget = {
//widget类型
type: '',
//widget的渲染方法
render: function (id) {
return this.type + ':' + id;
}
};
//一个widget工厂
var widgetFactory = st.factory('wdigetfactory', baseWidget);
//添加一个input
widgetFactory.add('input', {
type: 'input'
})
//找到添加的input
var input = widgetFactory.find('input');
//$fType为注册的类型名
expect(input.$fType).toBe('input');
//输出
expect(input.render('txt')).toBe("input:txt");
build
build
(
-
name
-
item
-
[parent]
)
Object | Klass
使用工厂创建产品方法,但不注册到factory中
Parameters:
name | type | flag | description |
---|---|---|---|
name
| String | 产品名称 | |
item
| Object | 产品特性 | |
[parent] |
String | optional | 父类名称,注册到factory中产品名称 |
Returns:
[Object | Klass]
返回创建的产品
Example:
//一个widget工厂
var widgetFactory = st.factory('wdigetfactory', {
//widget类型
type: '',
//widget的渲染方法
render: function (id) {
return this.type + ':' + id;
}
}, 'class');
var Tab = widgetFactory.build('Tab', {type: 'Tab'});
expect(widgetFactory.find('Tab')).toBeUndefined
var tab1 = new Tab;
expect(tab1.render('tab1')).toBe('Tab:tab1');
callBase
callBase
(
-
fnName
-
[baseName]
-
[args]
)
Object
调用基类的方法
Parameters:
name | type | flag | description |
---|---|---|---|
fnName
| String | 方法名称 | |
[baseName] |
String | optional | 基类名称 |
[args] |
Array | optional | 方法参数数组 |
Returns:
[Object]
执行结果
Example:
var Animate = st.klass("Animate", {
klassInit: function (name) {
this.name = name;
},
say: function (text) {
return this.name + ':' + text;
}
});
//继承user
var Bird = st.klass("Bird", {
//重写say方法
say: function (text) {
//调用基类方法
return '[Bird]' + this.callBase('say', [text]);
}
}, Animate);
var chicken = new Bird('chicken');
expect(chicken.say('hello')).toBe('[Bird]chicken:hello');
//创建一个class
var User = st.klass('user', {
klassInit: function (name) {
this.name = name;
},
say: function (text) {
return this.name + ',' + text;
}
});
//实例化一个User
var xiaoming = new User('小明');
//方法实例化
var xiaozhang = User('小张');
//多级继承例子。在多级继承中有一种场景每个子类方法都会调用父类的方法,而方法中又会使用到当前对象的属性,则问题就来了;
//如果是采用的parent.xxx然后传递this下的属性值过去,则没太大的问题。backbone就采用的这种。
//另外像base.js直接改写原始方法,将父对象封入闭包中,也无问题。只是这种限制比较大,只能调用父类的同名方法。
//而dojo采用的是this.parent.xxx.call(this)的方式,则就会悲剧了,死循环就来了。
//导致这样的原因就是将this带入parent方法后,父类又执行this.parent。而这是this则是子类的对象,那么方法就只会不停的调用parent的方法。
//在smartjs中klass调用父类方法由callBae这个方法来代理,同时使用指针来记录方法的执行轨迹,这样保证了从子到根的各级调用
var user2 = st.klass('user2', {
say: function (text) {
//调用父类
return this.callBase('say', [text]) + "-lv2";
}
}, User);
var user3 = st.klass('user3', {
say: function (text) {
//调用父类
return this.callBase('say', [text]) + "-lv3";
}
}, user2);
var user4 = st.klass('user4', {
say: function (text) {
//调用父类
return this.callBase('say', [text]) + "-lv4";
}
}, user3);
var roy = new user4('roy');
//继承路径
expect(roy._$inheirts + '').toBe('user4,user3,user2,user');
//依次执行到根,正确将当前的this对象的值输出
expect(roy.say('hello')).toBe('roy,hello-lv2-lv3-lv4');
//从3级开始执行
expect(roy.callBase('say', ['hello'])).toBe("roy,hello-lv2-lv3");
//指定从user开始执行
expect(roy.callBase('say', 'user', ['hello'])).toBe("roy,hello");
//上向略过2级执行
expect(roy.callBase('say', 2, ['hello'])).toBe("roy,hello-lv2");
callProto
callProto
(
-
name
-
[args]
)
调用原型链方法
Parameters:
name | type | flag | description |
---|---|---|---|
name
| String | 需要执行的原型链方法名 | |
[args] |
Array | optional | 执行参数 |
Returns:
[object] 返回执行结果
Example:
var Animate = st.klass("Animate", {
klassInit: function (name) {
this.name = name;
},
say: function (text) {
return this.name + ':' + text;
}
});
var chicken = new Animate('chicken');
chicken.say = function (text) {
//调用原型链方法
return '[Bird]' + this.callProto('say', [text]);
};
expect(chicken.say('hello')).toBe('[Bird]chicken:hello');
extend
extend
(
-
prop
)
chainable
类扩展方法
Parameters:
name | type | flag | description |
---|---|---|---|
prop
| Object | 扩展的属性和方法对象 |
Example:
var Animate = st.klass("Animate", {
klassInit: function (name) {
this.name = name;
},
say: function (text) {
return this.name + ':' + text;
}
});
var chicken = new Animate('chicken');
//扩展等同于 chicken.say = xxx
chicken.extend({
say: function (text) {
return 'hello';
}
});
expect(chicken.say('hello')).toBe('hello');
find
find
(
-
name
-
defaultMode
)
Object
查找注册的产品
Parameters:
name | type | flag | description |
---|---|---|---|
name
| String | 产品名称 | |
defaultMode
| Object | 是否在找不到产品的时候返回默认产品 |
Returns:
[Object]
返回查找的产品
fire
fire
(
-
name
-
[args]
-
[handler]
)
执行工厂中产品的方法,不会返回结果;当工厂类型为class时,则执行的则是原型链上的方法
Parameters:
name | type | flag | description |
---|---|---|---|
name
| String | 方法名称 | |
[args] |
Array | optional | 执行参数 |
[handler] |
Function | optional | 处理方法 |
Example:
var widgetFactory = st.factory('wdigetfactory', {
type: '',
render: function (id) {
return this.type + ':' + id;
}
});
widgetFactory.add('Panel', {
type: 'Panel'
});
widgetFactory.add('Tab', {
type: 'Tab'
});
var ret = '';
//执行每个widget的render方法;
widgetFactory.fire('render', ['id'], function (item, result) {
//this为widgetFactory;item为产品;result为render执行结果
ret += result + '-';
})
expect(ret).toBe('Panel:id-Tab:id-');
getBase
getBase
(
-
[baseName]
)
获取基类对象
Parameters:
name | type | flag | description |
---|---|---|---|
[baseName] |
String | optional | 基类名称,不设置则返回父类 |
Returns:
[object] 返回基类
Example:
var Animate = st.klass("Animate", {
klassInit: function (name) {
this.name = name;
},
say: function (text) {
return this.name + ':' + text;
}
});
//继承user
var Bird = st.klass("Bird", {
//重写say方法
say: function (text) {
//根据名称向上找到父类原型
var parent = this.getBase('Animate');
//调用原型链方法
return '[Bird]' + parent.say.call(this, text);
}
}, Animate);
var chicken = new Bird('chicken');
expect(chicken.say('hello')).toBe('[Bird]chicken:hello');
operate
operate
(
-
type
-
op
)
Object | Promise
数据服务通用操作方法;直接执行到具体的数据服务的方法上
Parameters:
name | type | flag | description | ||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
type
| String | 操作类型;1. search; 2. update | |||||||||
op
| Object | 参数;具体参数同数据服务
|
Returns:
[Object | Promise]
操作结果或者promise
remove
remove
(
-
name
)
chainable
在工厂中移除注册的产品
Parameters:
name | type | flag | description |
---|---|---|---|
name
| String | 产品名称 |
search
search
(
-
op
)
Object
执行数据服务search操作方法
Parameters:
name | type | flag | description | ||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
op
| Object | 参数;具体参数同数据服务
|
Returns:
[Object]
操作结果
setDefault
setDefault
(
-
name
)
chainable
将注册的产品设置成默认产品
Parameters:
name | type | flag | description |
---|---|---|---|
name
| String | 产品名称 |
Example:
//一个widget工厂
var widgetFactory = st.factory({
//工厂名
name: 'wdigetfactory',
//工厂类型
type: 'class',
//基类对象
base: {
//widget类型
type: '',
//widget的渲染方法
render: function (id) {
return this.type + ':' + id;
}
}
});
widgetFactory.add('Panel', {type: 'Panel'});
//将Panel设置成默认项
widgetFactory.setDefault('Panel')
//Tab未注册,但参数中设置了返回默认,则会返回Panel
var Tab = widgetFactory.find('Tab', true);
var tab1 = new Tab
expect(tab1.render('tab1')).toBe('Panel:tab1');
update
update
(
-
op
)
Object
执行数据服务update操作方法
Parameters:
name | type | flag | description | ||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
op
| Object | 参数;具体参数同数据服务
|
Returns:
[Object]
操作结果