Я использую пользовательскую функцию форматирования в jqGrid, чтобы заполнить ячейку «загрузки» значком загрузки, который связан. Он работал со всем моим встроенным кодом, но я просто переместил весь код JS в пользовательский объект, чтобы упаковать его и разместить в пространстве имен. Теперь, когда я вызываю пользовательскую функцию форматирования, ссылка «this» меняется на таблицу jqgrid, и она не может найти объект icons, созданный до построения сетки.
Все это имеет смысл, и мне интересно, как я могу ссылаться на объект значков, который является частью пользовательского объекта для переноса. Вот соответствующий код:
//loop over the json and build the colmodel, call custom formatter
jQuery.each(jsonObj, function() {
var sdFields = this.supplementalData.fields.field;
len = sdFields.length;
for(var i=0; i<len; i++) {
if(sdFields[i].display) {
var currOption = {};
currOption.name = sdFields[i].id;
currOption.index = sdFields[i].id;
if(sdFields[i].displayType == 'icon') {
currOption.formatter = this.resultsGridFormatter;
} else if(sdFields[i].dataType == 'date') {
//currOption.datefmt = 'mm/dd/YYYY';
currOption.formatter = 'date';
currOption.formatoptions = {
srcformat: 'Y-m-d',
newformat: 'm/d/Y'
};
}
currOption.jsonmap = sdFields[i].id;
currOption.width = sdFields[i].width;
currOption.align = sdFields[i].align;
currOption.sorttype = sdFields[i].dataType;
currOption.sortable = sdFields[i].sortable;
currOption.resizable = sdFields[i].resizeable;
colModel[i] = currOption;
}
}
});
//loop over jsonObj and build the icons object (assoc. array)
this.setIcons = function( jsonObj ) {
var iconsObj = {};
jQuery.each(jsonObj, function() {
var sdIcons = this.supplementalData.icons.icon;
var len = sdIcons.length;
for(var i=0; i<len; i++) {
iconsObj[sdIcons[i].id] = sdIcons[i].file;
}
});
this.icons = iconsObj;
};
//custom formatter that formats icon cells by referencing the icons created above
this.resultsGridFormatter = function(cellvalue, options, rowObject) {
console.log(this);
var icons = this.getIcons();
var cellVal = "";
var cssclass = "icon_"+options.colModel.name;
if(cellvalue != null) {
if(cellvalue.indexOf("://") != -1) {
//it is a URL, so link create the icon and link it
cellVal += "<a href='"+cellvalue+"' target='_blank'><img src='"+icons[options.colModel.name]+"' class='"+cssclass+"' /></a>";
}else{
//it is an id, so link to the details modal
cellVal += "<img src='"+icons[options.colModel.name]+"' id='"+cellvalue+"' class='"+cssclass+"' />";
}
} else {
cellVal += " ";
}
//console.log(cellvalue);
//console.log(options);
//console.log(rowObject);
return cellVal;
};
Мой оператор console.log в пользовательском модуле форматирования выводит таблицу jqgrid, поэтому вызов "this.getIcons ()" завершается неудачно, поскольку такого метода нет.
Можно ли в любом случае ссылаться на значки в пользовательском форматере? Должен ли я каким-то образом обернуть функцию, чтобы включить ее, или использовать другой подход?