在.w放grid组件,关联设置为树型的data,
data树型定义如下:
grid中主要设置如下:
需要注意grid中的flevel字段是维护级别的,平台默认没有维护需要在新增数据的时候自己维护,在新增根设置编码的时候需要用到
具体的实现代码如下
1.Model的构造函数中定义如下4个变量
var Model = function() { this.callParent(); this.selectedid, this.selectedParentID, this.selectedCode, this.selectedLevel = ""; };
2.data的新增前事件中获取当前选中行的父ID(fParentID)、编号(fCode)、级别(flevel)f给变量赋值
Model.prototype.treeDataBeforeNew = function(event) { this.selectedid = event.source.getRowID(); this.selectedParentID = event.source.getValue("fParentID"); this.selectedCode = event.source.getValue("fCode"); this.selectedLevel = event.source.getValue("flevel"); };
3.data的新增后事件中维护级别和编号的值
Model.prototype.treeDataAfterNew = function(event) { var data = event.source; var parent = data.getValue("fParentID");// 获取父ID的值 if (parent) { // 如果父ID有值,可以通过父ID获取父的层级的值 var parentRow = data.getRowByID(parent); data.setValue("flevel", parseInt(data.getValue("flevel", parentRow)) + 1);// 父的层级加1为当前记录的层级值 } else { // 如果父ID没有值,就直接给rowid设置层级设置为1(为根目录) data.setValue("flevel", 1); } var maxCode = ""; var newLevel = data.getValue("flevel"); if (newLevel == 1) {// 新建(新建根) maxCode = this.getNodeMaxCode(""); } else if (newLevel == this.selectedLevel) {// 新建兄弟 maxCode = this.getNodeMaxCode(this.selectedParentID); } else if (newLevel > this.selectedLevel) {// 新建子 maxCode = this.getNodeMaxCode(this.selectedid); } data.setValue("fCode", maxCode); };
getNodeMaxCode函数的定义如下:
Model.prototype.getNodeMaxCode = function(parnetID) { var maxCode = ""; var data = this.comp("treeData"); var rows = []; if (parnetID) { var row = data.getRowByID(parnetID); // 前提要注意判断子和获取子要求子数据已经加载,如果没有加载是获取不到的; // data上delayLoad默认是延迟加载的,展开的时候才会加载子数据,如果没有展开数据,可以设置data不延迟加载数据或者自己在获取的时候调用grid上的API展开数据 // 如果数据量比较大 必须是延迟加载 那就需要通过发送action请求去biz层查询数据 if (row.hasChildren()) {// 判断是否有子数据 rows = row.children();// 获取这个父节点下的同级子节点 } } else { rows = data.find([ 'flevel' ], [ "1" ]); } if (rows) { if (rows.length == 1) { maxCode = this.selectedCode + "001"; } else { for ( var row in rows) { if (maxCode < data.getValue("fCode", rows[row])) { maxCode = data.getValue("fCode", rows[row]); } } var len = maxCode.length; var maxCodeLeft = maxCode.substr(0, len - 3); var maxCodeRight = maxCode.substr(len - 3, 3); maxCodeRight = justep.String.zeros(justep.String.toInt(maxCodeRight, 0) + 1, 3); maxCode = maxCodeLeft + maxCodeRight; } } return maxCode; }
评一波