我觉得你的问题很有趣,但解决这个问题并不容易。在我看来,两个 jqGrid 方法的源代码groupingRender
尤其groupingToggle
应该改变。我建议您可以在演示中看到的解决方案。该演示覆盖了groupingRender
和groupingToggle
方法的原始代码。您将在下面找到我的建议的更完整描述。
首先,我想用我的话来描述这个问题。您在问题的文本中使用了“子网格的行”一词,这带来了误解。您使用的是多级分组。我认为第一个问题是groupCollapse: true选项的行为。在多级分组的情况下,jqGrid 当前仅折叠数据而不是所有分组标题,直到顶层。该演示使用 3 级分组和选项groupCollapse: true
. 它不正常
而不是直觉上的预期
您在问题中提出的另一个问题是当前的消费行为。问题是,如果用户已经将节点折叠到所有看起来紧凑的节点,就像我发布的最后一张图片一样,结束然后用户展开一些节点jqGrid 展开节点的所有子分组标题直到数据。因此,如果一个仅扩展“test1”节点,则其所有子节点将被扩展,而不是仅扩展下一个分组级别。
为了解决第一个问题(尽管打开了子分组标题groupCollapse: true
),我更改了一行groupingRender
方法
str += "<tr id=\""+hid+"\" role=\"row\" class= \"ui-widget-content jqgroup ui-row-"+$t.p.direction+" "+clid+"\"><td style=\"padding-left:"+(n.idx * 12) + "px;"+"\" colspan=\""+colspans+"\">"+icon+$.jgrid.template(grp.groupText[n.idx], gv, n.cnt, n.summary)+"</td></tr>";
至
str += "<tr id=\""+hid+"\"" +(grp.groupCollapse && n.idx>0 ? " style=\"display:none;\" " : " ") + "role=\"row\" class= \"ui-widget-content jqgroup ui-row-"+$t.p.direction+" "+clid+"\"><td style=\"padding-left:"+(n.idx * 12) + "px;"+"\" colspan=\""+colspans+"\">"+icon+$.jgrid.template(grp.groupText[n.idx], gv, n.cnt, n.summary)+"</td></tr>";
你问的主要问题有点困难。您可以在下面找到固定版本
$.jgrid.extend({
groupingToggle : function(hid){
this.each(function(){
var $t = this,
grp = $t.p.groupingView,
strpos = hid.split('_'),
uidpos,
//uid = hid.substring(0,strpos+1),
num = parseInt(strpos[strpos.length-2], 10);
strpos.splice(strpos.length-2,2);
var uid = strpos.join("_"),
minus = grp.minusicon,
plus = grp.plusicon,
tar = $("#"+$.jgrid.jqID(hid)),
r = tar.length ? tar[0].nextSibling : null,
tarspan = $("#"+$.jgrid.jqID(hid)+" span."+"tree-wrap-"+$t.p.direction),
getGroupingLevelFromClass = function (className) {
var nums = $.map(className.split(" "), function (item) {
if (item.substring(0, uid.length + 1) === uid + "_") {
return parseInt(item.substring(uid.length + 1), 10);
}
});
return nums.length > 0 ? nums[0] : undefined;
},
itemGroupingLevel,
collapsed = false, tspan;
if( tarspan.hasClass(minus) ) {
if(grp.showSummaryOnHide) {
if(r){
while(r) {
if($(r).hasClass('jqfoot') ) {
var lv = parseInt($(r).attr("jqfootlevel"),10);
if( lv <= num) {
break;
}
}
$(r).hide();
r = r.nextSibling;
}
}
} else {
if(r){
while(r) {
itemGroupingLevel = getGroupingLevelFromClass(r.className);
if (itemGroupingLevel !== undefined && itemGroupingLevel <= num) {
break;
}
$(r).hide();
r = r.nextSibling;
}
}
}
tarspan.removeClass(minus).addClass(plus);
collapsed = true;
} else {
if(r){
var showData = undefined;
while(r) {
itemGroupingLevel = getGroupingLevelFromClass(r.className);
if (showData === undefined) {
showData = itemGroupingLevel === undefined; // if the first row after the opening group is data row then show the data rows
}
if (itemGroupingLevel !== undefined) {
if (itemGroupingLevel <= num) {
break;// next item of the same lever are found
} else if (itemGroupingLevel === num + 1) {
$(r).show().find(">td>span."+"tree-wrap-"+$t.p.direction).removeClass(minus).addClass(plus);
}
} else if (showData) {
$(r).show();
}
r = r.nextSibling;
}
}
tarspan.removeClass(plus).addClass(minus);
}
$($t).triggerHandler("jqGridGroupingClickGroup", [hid , collapsed]);
if( $.isFunction($t.p.onClickGroup)) { $t.p.onClickGroup.call($t, hid , collapsed); }
});
return false;
},
});
该演示演示了我建议的所有更改的结果。我会将更改作为拉取请求发布到 trirand。我希望这些更改将包含在 jqGrid 的主要代码中。
更新:我发布了带有我上面建议的更改的拉取请求。
更新 2:我的拉取请求与 jqGrid 的主要代码合并。今天发布的新的 4.5.4 版本的 jqGrid 包括了更改。新的演示使用 jqGrid 4.5.4,它的工作方式与您期望的一样。因此,要解决您在问题中描述的问题,您只需更新 jqGrid。