Получить внешние данные в пользовательскую функцию форматера jqGrid - PullRequest
1 голос
/ 11 января 2011

Я использую пользовательскую функцию форматирования в 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 += "&nbsp;";
    }
    //console.log(cellvalue);
    //console.log(options);
    //console.log(rowObject);
    return cellVal;
};

Мой оператор console.log в пользовательском модуле форматирования выводит таблицу jqgrid, поэтому вызов "this.getIcons ()" завершается неудачно, поскольку такого метода нет.

Можно ли в любом случае ссылаться на значки в пользовательском форматере? Должен ли я каким-то образом обернуть функцию, чтобы включить ее, или использовать другой подход?

1 Ответ

0 голосов
/ 12 января 2011

Пользовательская функция форматера будет вызываться для call, где первый параметр (новое значение this) является сеткой (см. исходный код ).Вы также описываете этот факт в своем вопросе.

Вы можете легко исправить свой код, если кешируете нужное значение this и используете его внутри своего пользовательского форматера resultsGridFormatter.Я имею в виду, что вы можете изменить код примерно следующим

var ts = this;
//custom formatter that formats icon cells by referencing the icons created above
this.resultsGridFormatter = function(cellvalue, options, rowObject) {
    console.log(this);
    console.log(ts);
    var icons = ts.getIcons();
    var cellVal = "";
    // all your other previous code 
    return cellVal;
};
...