javascript - jqgrid创建后如何应用列模板

标签 javascript jquery asp.net-mvc-4 jqgrid free-jqgrid

免费的jqgrid不允许在创建后应用列模板。 我试过了

  var newOrderPriceTemplate = {
    align: "center",
    formatter: "showlink",
    formatoptions: {
        onClick: function() { alert('clicked'); }
    }
    };

    $(function () {
      ... code to create jqgrid into $grid
      $grid.jqGrid('setColProp', 'Hind', {
        template: newOrderPriceTemplate,
        search: false
    }); 
    });

如果在列中单击,则不会出现警报框。 search: false 正确删除搜索字段,因此执行 setColProp。

如何在 jqgrid 创建之后但显示之前应用 newOrderPriceTemplate。 如果在创建时在 colModel 中指定了模板,则它可以工作。

使用最新的免费jqgrid、jquery、bootstrap 3、aps.net mvc4、.net 4.6。

最佳答案

我认为人们对模板的工作原理存在误解。 Template 只是一个设置列表,将在 $.extend 中使用,将 colModel 中的一些当前属性与 template 的另一个对象组合起来属性。

我建议阅读the code fragment免费 jqGrid 的代码。简化形式的代码如下所示

for (iCol = 0; iCol < p.colModel.length; iCol++) {
    p.colModel[iCol] = $.extend(true, {},
        p.cmTemplate,
        p.colModel[iCol].template || {},
        p.colModel[iCol]);
}

换句话说,jqGrid 将列的 cmTemplatetemplate 属性的值与 colModel 的属性组合在一起。 jqGrid 在创建网格开始时执行此操作。

因此,如果您有一些模板(例如 newOrderPriceTemplate),您需要在创建网格后应用,那么您只需使用 $。手动扩展以扩展(并覆盖)现有属性:

var p = $grid.jqGrid("getGridParam");

p.colModel[p.iColByName.Hind] = $.extend(true, {},
    p.colModel[p.iColByName.Hind], // old values
    newOrderPriceTemplate,         // the applied template
    { search: false }              // one more setting to apply
);

务必将新属性放置在 p.colModel[p.iColByName.Hind] 的当前设置之后,以便能够覆盖那里。

关于javascript - jqgrid创建后如何应用列模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39318419/

相关文章:

c# - 如何让 Controller 从发布的 JSON 对象设置 ObjectId

javascript - 三.JS OBJ模型不显示

javascript - 如何将动态表单的字符集设置为UTF-8?

javascript - 响应式设计和 .click() 事件监听器的问题

javascript - Android提交使用jquery的https登录表单

javascript - bootstrap-multiselect 在表内不起作用

javascript - top navbar sticky 不适用于 Chrome 和 Safari,但适用于 mozilla

javascript - 使用 NPM ShellJS 在 Node 中执行 Git 命令返回 `stdout` 内的空字符串

javascript - 为什么我不能编辑附加的文本区域?

javascript - TimeEntry Js 函数不适用于动态添加的文本框