in src/framework/MUtil.tsx [329:361]
dependency: function (fs:MFieldSchema[], all:MFieldSchema[]) {
// 先建个索引
const allFieldsIdx = _.keyBy(all, "name");
// 构造未被依赖的集合
let ndep = _.keyBy(all, "name"); // 全体
ndep = _.omit(ndep, fs.map(f=>f.name)); // 去掉fs
// 构造被依赖的集合
let dep = new Map<string, MFieldSchema>();
fs.forEach(f => dep[f.name] = f);
// 循环从ndep里把被依赖的字段放到dep中,直到dep不再增加
// 算法有点粗暴,将就用吧
for(let i = 0; i < all.length; i ++) { // 轮数最多all.length,防止卡死
let newDepNames = []
for(let dn in dep) {
const i = _.intersection( dep[dn].showIf?.split(/[^a-zA-Z0-9_$]/), Object.keys(ndep) );
newDepNames = newDepNames.concat(i);
}
let prevSize = Object.keys(dep).length;
for(let n of newDepNames){
dep[n] = allFieldsIdx[n];
delete ndep[n];
}
let afterSize = Object.keys(dep).length;
if(prevSize == afterSize) {
break; // 如果找不到更多依赖,就可以结束了
}
}
return Object.values(dep);
},