listViewBase是列表组件所有文件中最核心的一个,它抽象了所有列表的公共逻辑,将来如果有必要添加其它公共的逻辑,都可以考虑在这个类中处理。它主要做的事情包括:初始化,如排序组件初始化,分页组件初始化,模板管理引擎初始化,事件绑定和请求发送及处理等。这个文件看起来比较长,有300度行,但是非常好理解。下面我会把它的每个要点内容一一说明。
源码地址:https://github.com/liuyunzhuge/blog/blob/master/form/src/js/mod/listView/base/listViewBase.js
首先看看代码的整体结构。

注:代码中的EventBase是我原来写的一个组件,基于jquery,简单实现任意对象支持事件管理的功能【jquery技巧之让任何组件都支持类似DOM的事件管理】;Class也是我原来写的一个组件,用来支持面向对象思想的类的构造&继承【详解Javascript的继承实现】;Ajax也是一个简单的组件,对jquery的ajax进行了二次封装,以便ajax请求的管理更符合自己的思维习惯【对jquery的ajax进行二次封装以及ajax缓存代理组件:AjaxCache】。
listViewBase的整体结构跟我以前的写的组件基本一致,毕竟已经养成这个习惯了。DEFAULTS表示组件的默认options,它继承了EventBase来实现自身的事件管理。在组件类的静态成员上,绑定了DEFAULTS,是为了方便子类进行引用;定义了一个dataAttr的属性,它有两个作用:第一是作为data属性,在将组件实例绑定到相关DOM元素的jq对象上时用到:

第二是用于生成组件的事件命名空间,组件内所有的事件都会加上这个事件命名空间,以便不会产生事件冲突:


接着看看DEFAULTS的定义,我会挑主要的进行解释:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
|
var DEFAULTS = { //接口地址 url: '', //数据模板 tpl: '', //ajax请求方法 ajaxMethod: 'get', //判断成功的ajax isAjaxResSuccess: function (res) { return res.code == 200; }, //从ajax返回中解析出数据 getRowsFromAjax: function (res) { return res.data.rows; }, //从ajax返回中解析出总记录数 getTotalFromAjax: function (res) { return res.data.total; }, //提供给外部解析ajax返回的数据 parseData: $.noop, //提供给模板引擎,以便得到满足其要求的数据 renderParse: function(paredRows){ return { rows: paredRows } }, //组件初始化完毕后的回调 afterInit: $.noop, //ajax请求之前的事件回调 beforeAjax: $.noop, //ajax请求之后的事件回调 afterAjax: $.noop, //ajax请求成功的事件回调 success: $.noop, //ajax请求失败的事件回调 error: $.noop, //PageView相关的option,为空表示不采用分页 pageView: {}, //SortView相关的option,为空表示不采用排序管理 sortView: false, //在调用query方法的时候,是否自动对SortView进行reset resetSortWhenQuery: false, //查询延时 queryDelay: 0, }; |
其中:
1)isAjaxResSuccess , getRowsFromAjax , getTotalFromAjax作用跟ajax的返回解析有关。通常做了自定义的ajax返回封装后,ajax的返回可能是类似这样的:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
|
{ "code": 200, "data": { "total": 237, "rows": [ { "like": 2, "title": "博客标题博客标题", "avatar": "", "summary": "可以看到这个列表页其实是用到了很多语义化的命名的css类的,假如要用面向属性的命名方法来定义,就会变成下面这个样子:,可以看到这个列表页其实是用到了很多语义化的命名的css类的,假如要用面向属性的命名方法来定义,就会变成下面这个样子:", "author": "流云诸葛", "publish_time": "2016-06-05 08:53", "comment": 22, "read": "666" }, { "like": 2, "title": "博客标题博客标题", "avatar"܌模板管理引擎初始化,事件绑定和请求发送及处理等。这个文件看起来比较长,有300度行,但是非常好理解。下面我会把它的每个要点内容一一说明。
源码地址:https://github.com/liuyunzhuge/blog/blob/master/form/src/js/mod/listView/base/listViewBase.js
首先看看代码的整体结构。

注:代码中的EventBase是我原来写的一个组件,基于jquery,简单实现任意对象支持事件管理的功能【jquery技巧之让任何组件都支持类似DOM的事件管理】;Class也是我原来写的一个组件,用来支持面向对象思想的类的构造&继承【详解Javascript的继承实现】;Ajax也是一个简单的组件,对jquery的ajax进行了二次封装,以便ajax请求的管理更符合自己的思维习惯【对jquery的ajax进行二次封装以及ajax缓存代理组件:AjaxCache】。
listViewBase的整体结构跟我以前的写的组件基本一致,毕竟已经养成这个习惯了。DEFAULTS表示组件的默认options,它继承了EventBase来实现自身的事件管理。在组件类的静态成员上,绑定了DEFAULTS,是为了方便子类进行引用;定义了一个dataAttr的属性,它有两个作用:第一是作为data属性,在将组件实例绑定到相关DOM元素的jq对象上时用到:

第二是用于生成组件的事件命名空间,组件内所有的事件都会加上这个事件命名空间,以便不会产生事件冲突:


接着看看DEFAULTS的定义,我会挑主要的进行解释:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
|
var DEFAULTS = { //接口地址 url: '', //数据模板 tpl: '', //ajax请求方法 ajaxMethod: 'get', //判断成功的ajax isAjaxResSuccess: function (res) { return res.code == 200; }, //从ajax返回中解析出数据 getRowsFromAjax: function (res) { return res.data.rows; }, //从ajax返回中解析出总记录数 getTotalFromAjax: function (res) { return res.data.total; }, //提供给外部解析ajax返回的数据 parseData: $.noop, //提供给模板引擎,以便得到满足其要求的数据 renderParse: function(paredRows){ return { rows: paredRows } }, //组件初始化完毕后的回调 afterInit: $.noop, //ajax请求之前的事件回调 beforeAjax: $.noop, //ajax请求之后的事件回调 afterAjax: $.noop, //ajax请求成功的事件回调 success: $.noop, //ajax请求失败的事件回调 error: $.noop, //PageView相关的option,为空表示不采用分页 pageView: {}, //SortView相关的option,为空表示不采用排序管理 sortView: false, //在调用query方法的时候,是否自动对SortView进行reset resetSortWhenQuery: false, //查询延时 queryDelay: 0, }; |
其中:
1)isAjaxResSuccess , getRowsFromAjax , getTotalFromAjax作用跟ajax的返回解析有关。通常做了自定义的ajax返回封装后,ajax的返回可能是类似这样的:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
|
{ "code": 200, "data": { "total": 237, "rows": [ { "like": 2, "title": "博客标题博客标题", "avatar": "", "summary": "可以看到这个列表页其实是用到了很多语义化的命名的css类的,假如要用面向属性的命名方法来定义,就会变成下面这个样子:,可以看到这个列表页其实是用到了很多语义化的命名的css类的,假如要用面向属性的命名方法来定义,就会变成下面这个样子:", "author": "流云诸葛", "publish_time": "2016-06-05 08:53", "comment": 22, "read": "666" }, { "like": 2, "title": "博客标题博客标题", "avatar""crayon-c">//数据模板 tpl: '', | |