在.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;
}

评一波