2
votes

I need to access the column name dynamically in Kendo Grid template.

Code:

    $("#grid").kendoGrid({
  dataSource: [
     { Quantity: 2 , Amount: 650},
    { Quantity: 0, Amount: 0 },
    { Quantity: 1, Amount: 500 },   
    { Quantity: 4, Amount: 1047 }
  ],
  sortable: true,
  columns: [
    {
      field: "Quantity",
      template: function (dataItem) {
          if (dataItem.Quantity == '0') {
            return "--";
          } else {
            return dataItem.Quantity;
          }
        }
    },

    {
      field: "Amount",
      template: function (dataItem) {
          if (dataItem.Amount == '0') {
            return "--";
          } else {
            return dataItem.Amount;
          }
        }
    }
  ]
});

Here inside the "columns -> template", I need to access the column thru variable instead of hardcoding it. How can I do that? Because in real life I will be having dynamic columns populated into dataSource and I will construct the columns array inside the for loop. Please help.

Please access this JSBIN: http://jsbin.com/egoneWe/1/edit

1

1 Answers

4
votes

From what I understand, you build the columns array using something like:

var Definition = [
    { field: "Quantity" },
    { field: "Amount" }
];

var columns = [];
$.each(Definition, function (idx, item) {
    columns.push({
        field   : item.field,
        template: function (dataItem) {
            ...;
        }
    })
});

$("#grid").kendoGrid({
    dataSource: data,
    sortable  : true,
    columns   : columns
});

Right? And the problem is that you want to use the same template function for several (all) columns instead of having to rewrite many.

If so, what you can do is:

var Definition = [
    { field: "Quantity" },
    { field: "Amount" }
];
var columns = [];
$.each(Definition, function (idx, item) {
    columns.push({
        field   : item.field,
        template: function (dataItem) {
            return commonTemplateFunction(dataItem, item.field);
        }
    })
});

What I use in the columns array (columns definition for the Grid) is a function that receives two arguments: the dataItem for the row and the field's name being edited.

Then, I define the template function as:

function commonTemplateFunction(dataItem, field) {
    if (dataItem[field] == '0') {
        return "--";
    } else {
        return dataItem[field];
    }
}

And your modified code is here : http://jsbin.com/egoneWe/3/edit

So, despite I cannot guess the column name, I can do the trick using the columns initiator.