我正在为我的jqGrid columnModel使用自定义格式化程序,我无法使用格式化程序函数进行排序。如果我删除格式化列正常排序。
jQuery("#listAgentOptions").jqGrid({
height: 240,
datatype: "local",
colNames: [' ', 'First Name', 'Last Name', 'Role'],
colModel: [
{ name: 'status', index: 'status', width: 18, sorttype: 'text', align: 'center', formatter: function(cellvalue, options, rowObject) {
return cellvalue == 1 ? "<img src='images/agent_green_s.png' alt='Ready' title='Ready' />" :
cellvalue == 3 ? "<img src='images/agent_red_s.png' alt='Busy' title='Busy' />" :
"<img src='images/agent_orange_s.png' alt='Pending Ready' title='Pending Ready' />";
},
unformat:
function(cellvalue, options, rowObject) { return Math.floor(Math.random() + 0.1).toString(); }
},
{ name: 'firstName', index: 'firstName', width: 92 },
{ name: 'lastName', index: 'lastName', width: 142 },
{ name: 'role', index: 'role', sorttype: 'int', width: 36, align: 'center', formatter: function(cellvalue, options, rowObject) {
return cellvalue == true ? "<img src='images/user_gray.png' alt='Supervisor' title='Supervisor' />" : "<img src='images/user.png' alt='Agent' title='Agent' />";
}, unformat:
function(cellvalue, options, rowObject) { return cellvalue; }
}
],
sortname: 'lastName'
});
行添加如下:
jQuery("#listAgentOptions").jqGrid('clearGridData');
$.each(result, function(i, item) {
if (item.ContactType == 1) {
jQuery("#listAgentOptions").jqGrid('addRowData', i+1, { firstName: item.ContactName.split(" ")[0], lastName: item.ContactName.split(" ")[1],
role: item.IsSupervisor,
status: item.Status == "Ready" ? 1 : item.Status == "Busy" ? 3 : 2
});
}
});
如何让排序正常工作?
更新。我刚刚下载了最新版本的jqGrid - 同样的问题。
我也尝试过使用unformat: function(cellvalue, options, rowObject) { }
,但是cellvalue在那里是空的:-E当我使用return Math.floor(Math.random() + 0.1).toString();
时,它会随机排序(每次点击),但return cellvalue;
只返回一个空字符串。
答案 0 :(得分:2)
在内部,jqGrid使用unformat
来获取单元格的值:
$.each(ts.rows, function(index, row) {
try { sv = $.unformat($(row).children('td').eq(col),{rowId:row.id, colModel:ts.p.colModel[col]},col,true);}
catch (_) { sv = $(row).children('td').eq(col).text(); }
row.sortKey = findSortKey(sv);
rows[index] = this;
});
然后使用列的sorttype
的处理程序解析单元格值,对于int:
findSortKey = function($cell) {
return IntNum($cell.replace(stripNum, ''),0);
};
所以基本上,如果你的unformat
函数为每个单元格返回正确的整数,我希望列排序也能正常工作。如果您仍然遇到问题,请发布完整的代码,包括unformat
。
答案 1 :(得分:1)
可能是你的问题不在你寻找的地方。
您在jqGrid中使用哪种数据?我的意思是参数数据类型的值。如果从服务器加载jqGrid数据,服务器将从客户端接收排序信息,服务器必须返回已排序的数据。 Formatter仅用于显示您喜欢的数据。 客户端排序可以使用datatype: 'xmlstring'
和datatype: "clientSide"
,但不能使用dataType:"xml"
或dataType:"json"
和dataType:"jsonp"
。像sorttype
这样的参数只适用于客户端排序,并且会被服务器端排序忽略。主要角色:如果必须定义jqGrid的 url 参数,请使用服务器端排序。
答案 2 :(得分:1)
好的,我已经知道发生了什么。
首先,您必须使用unformat
将初始值传递回jqGrid排序函数。
jqGrid正在将$(row).text()
传递给unformat
函数,对于只有html标记的单元格,该函数返回一个空字符串,并且没有更改它的选项。但是,你可以做的是使用unformat
函数的第三个参数,在我的例子中是rowObject
。然后,您可以使用$(rowObject).html()
检索实际的单元格值,并将其解析回值。现在可以进行排序。
要记住的另一件事是,如果您使用sorrtype: 'int'
,则必须将整数作为字符串返回,例如return '1';
。
答案 3 :(得分:0)
尝试使用Firebug进行调试并检查服务器正在接收的内容。使用sortable: true
。
顺便说一句,sorttype
参数只能在本地(datatype: local
)工作。