数据服务管理;定义了数据服务的接口和通用操作方法;不能直接使用,必须创建具体类型的数据服务; 数据服务的定义就比较广了,可以是具体的对象方式locaStorage,IndexDB,或者是一些行为ajax,comet,websocket;也可以是根据业务规则定义的rest,cache等;

Extends Factory
Module: DataManager

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

Inherited from factory: src\base\oop.js:274

添加产品方法,注册到factory中

Parameters:

nametypeflagdescription
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

Inherited from factory: src\base\oop.js:252

使用工厂创建产品方法,但不注册到factory中

Parameters:

nametypeflagdescription
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

Inherited from klassBase: src\base\oop.js:60

调用基类的方法

Parameters:

nametypeflagdescription
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]
)

Inherited from klassBase: src\base\oop.js:22

调用原型链方法

Parameters:

nametypeflagdescription
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

Inherited from klassBase: src\base\oop.js:95

类扩展方法

Parameters:

nametypeflagdescription
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

Inherited from factory: src\base\oop.js:287

查找注册的产品

Parameters:

nametypeflagdescription
name String

产品名称

defaultMode Object

是否在找不到产品的时候返回默认产品

Returns:

[Object]

返回查找的产品

fire

fire
(
  • name
  • [args]
  • [handler]
)

Inherited from factory: src\base\oop.js:333

执行工厂中产品的方法,不会返回结果;当工厂类型为class时,则执行的则是原型链上的方法

Parameters:

nametypeflagdescription
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]
)

Inherited from klassBase: src\base\oop.js:35

获取基类对象

Parameters:

nametypeflagdescription
[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:

nametypeflagdescription
type String

操作类型;1. search; 2. update

op Object

参数;具体参数同数据服务

nametypeflagdescription
dsType Object

数据服务类型

Returns:

[Object | Promise]

操作结果或者promise

remove

remove
(
  • name
)
chainable

Inherited from factory: src\base\oop.js:317

在工厂中移除注册的产品

Parameters:

nametypeflagdescription
name String

产品名称

setDefault

setDefault
(
  • name
)
chainable

Inherited from factory: src\base\oop.js:305

将注册的产品设置成默认产品

Parameters:

nametypeflagdescription
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:

nametypeflagdescription
op Object

参数;具体参数同数据服务

nametypeflagdescription
dsType Object

数据服务类型

Returns:

[Object]

操作结果

Top