在我的jqGrid中有以下内容:
colModel.push({ name: 'pcc2008-2007', index: 'pcc0807', width: 100, align: "Right",
sorttype: "float", formatter: "number", resizable: false,
formatter: function (cellvalue, options, rowObject) {
return percentageChange(rowObject['vol08'], rowObject['vol07'], 4);
}
});
格式化程序工作正常,最后返回一个值(前缀为%),但是当我点击网格上的列标题时,结果不会被排序。
我添加了一个“unformatter”函数,它只是将“%”替换为什么,看不出是否产生了正确的排序,但同样排序根本没有正确实现。
有人可以解释我做错了吗?
**编辑**
function percentageChange(endYear, startYear, duration) {
var p1 = Math.abs((endYear - startYear) / Math.abs(startYear) * 100);
if (p1 == Number.POSITIVE_INFINITY || p1 == Number.NEGATIVE_INFINITY) { return '0'; }
if (isNaN(p1)) { return '0'; }
else { return Math.round(p1 * 100) / 100; }
}
** EDI2 **
整个jqGrid在这里打电话:
$("#list2").jqGrid({
datastr: formattedBrandData,
datatype: "jsonstring",
colModel: colModel,
height: 'auto',
width: 1000,
loadonce: true,
sortable: true,
gridview: true,
shrinkToFit: false,
viewrecords: true,
rowNum: 100,
gridComplete: function (index, colindex, sortorder) {
var aaa = $("#list2").jqGrid('getRowData');
formattedBrandData = aaa;
drawChart();
var rowIDs = jQuery("#list2").getDataIDs();
for (var i = 0; i < rowIDs.length; i = i + 1) {
if (i == 0) { var trElement = jQuery("#" + rowIDs[i], $('#list2')); trElement.removeClass('ui-widget-content'); trElement.addClass('resultsColour1'); }
if (i == 1) { var trElement = jQuery("#" + rowIDs[i], $('#list2')); trElement.removeClass('ui-widget-content'); trElement.addClass('resultsColour2'); }
if (i == 2) { var trElement = jQuery("#" + rowIDs[i], $('#list2')); trElement.removeClass('ui-widget-content'); trElement.addClass('resultsColour3'); }
if (i == 3) { var trElement = jQuery("#" + rowIDs[i], $('#list2')); trElement.removeClass('ui-widget-content'); trElement.addClass('resultsColour4'); }
if (i == 4) { var trElement = jQuery("#" + rowIDs[i], $('#list2')); trElement.removeClass('ui-widget-content'); trElement.addClass('resultsColour5'); }
if (i == 5) { var trElement = jQuery("#" + rowIDs[i], $('#list2')); trElement.removeClass('ui-widget-content'); trElement.addClass('resultsColour6'); }
if (i == 6) { var trElement = jQuery("#" + rowIDs[i], $('#list2')); trElement.removeClass('ui-widget-content'); trElement.addClass('resultsColour7'); }
if (i == 7) { var trElement = jQuery("#" + rowIDs[i], $('#list2')); trElement.removeClass('ui-widget-content'); trElement.addClass('resultsColour8'); }
}
},
loadComplete: function () {
},
jsonReader: {
repeatitems: false,
root: function (obj) {
return obj;
},
onComplete: function (data, response) {
}
}
});
答案 0 :(得分:3)
我认为你应该更好地使用
formatter: 'currency', formatoptions: {suffix: '%'}, sorttype: 'currency'
请参阅the demo:
更新:您发布的代码存在一些问题。
第一个是jqGrid将调用的gridComplete
回调。 jqGrid从不使用其他参数调用gridComplete
,因此回调的index
,colindex
和sortorder
参数将始终为undefined
。您应该删除参数。
第二个问题是设计问题。您可以将datatype: "jsonstring"
与提供数据的datastr: formattedBrandData
一起使用。数据将一次读取,数据将保存在内部data
数组中,其属性与name
的{{1}}属性相同。因此,在colModel
数组中填充'pcc2008-2007'
属性会更有效,更轻松。您将计算值一次,并将仅使用计算的formattedBrandData
结果。稍后您可以直接使用预定义的float
格式化程序(请参阅上面的答案),仅在浮点值的末尾添加currency
。
如果您使用某种本地数据类型(包括%
),则不应将datatype: "jsonstring"
其他用作index
。如果将使用name
属性中的值,最好从index
中删除任何colModel
定义。支持name
和name
的不同值,仅在index
或datatype: "json"
的情况下才有用,其中服务器代码负责数据的排序。
只要有可能,您应该在datatype: "xml"
或gridComplete
内减少网格的更改次数(或HTML页面上数据的任何其他更改)。如果一个元素发生一次更改,则Web浏览器必须重新计算页面上所有其他现有元素的位置。因此页面上元素的更改可能很昂贵。另一方面,loadComplete
与格式化程序的使用,gridview: true
回调(请参阅here)或rowattr
允许修改网格之前的HTML片段< / em>它将被放置在页面上。在你获得最佳表现的方式。有关演示cellattr
回调的相应代码示例,请参阅the answer。
关于性能的最后一点评论。代码rowattr
慢慢为jQuery("#" + rowIDs[i], $('#list2'))
。原因是jQuery("#" + rowIDs[i])
只使用被编入索引的jQuery("#" + rowIDs[i])
。所以它很快就能运作。另一方面,代码id
使用显式上下文,不允许使用HTML页面的索引 。因此,简单扫描将用于实施,这将是缓慢的。