/**
* 使用table tr td制作的table
*
* @file Table入口
* @author Brian Li (lbxxlht@163.com)
*/
var define = typeof define === 'function' && define.amd ? define : function (factory) {
typeof module === 'object' ? (module.exports = factory(require)) : '';
};
define(function (require) {
var Controller = require('../core/controller');
var util = require('../core/util');
var tpl = require('../tpls/table-tpl');
// public /////////////////////////////////////////////////////////////////
/**
* Table构造函数
*
* @param {Object} param 初始化参数
* @param {Array.<Fields>} param.fields 列配置
* @param {Array.<Object>} param.datasource 数据源
* @return {Table} Table实例
*/
function Table(param) {
if (!(this instanceof Table)) {
return new Table(param);
}
param = param || {};
param.fields = param.fields || [];
param.datasource = param.datasource || [];
// 获取原始模板
var tplString = tpl(param);
param.tpl = tplString;
// 预处理数据源
var originalDatasource = param.datasource;
param.datasource = {};
param.datasource.__datasource__ = originalDatasource;
param.datasource.__fields__ = param.fields;
param.datasource.__prepare__ = prepare;
// 调用父类初始化
Controller.call(this, param);
}
util.inherit(Table, Controller);
/**
* 根据鼠标响应的DOM获取该DOM所在的单元格
*
* @param {HtmlElement} dom 鼠标响应的DOM
* @return {Array.<number>} [row, column]单元格坐标;[-1, -1]代表表格;[-1, n] 代表表头
*/
Table.prototype.getMouseAxis = function (dom) {
var row = -1;
var column = -1;
var classes = dom.className.split(' ');
if (classes.indexOf('table') > -1) {
return [row, column];
}
var dataset = util.getDataset(dom);
column = parseInt(dataset.uiColumn, 10);
row = parseInt(dataset.uiRow, 10);
while (isNaN(column) && dom.tagName !== 'BODY') {
dom = dom.parentNode;
dataset = util.getDataset(dom);
column = parseInt(dataset.uiColumn, 10);
row = parseInt(dataset.uiRow, 10);
}
column = isNaN(column) ? -1 : column;
row = isNaN(row) ? -1 : row;
return [row, column];
};
// private ///////////////////////////////////////////////////////
/**
* 表格数据预处理
* 将用户传入的一维对象数组,根据fields配置,翻译成可直接渲染的二维数组
*
* @param {Array.<Object>} it 原始数据源
* @return {Array.<Array>} 可渲染数据源,导入模板引擎的数据源
*/
function prepare(it) {
var result = [];
var fields = this.__fields__;
for (var n = 0; n < it.length; n++) {
var row = [];
var item = it[n];
for (var m = 0; m < fields.length; m++) {
var content = fields[m].content;
var field = fields[m].field;
if (!content && typeof field === 'string') {
row.push(item[field]);
continue;
}
if (typeof content === 'string') {
row.push(item[content]);
continue;
}
if (typeof content === 'function') {
row.push(content(item));
continue;
}
row.push('');
}
result.push(row);
}
return result;
}
return Table;
});
|