【问题标题】:How to use free jqgrid properties to conditionally add actions buttons如何使用免费的 jqgrid 属性有条件地添加操作按钮
【发布时间】:2015-06-26 02:49:14
【问题描述】:

free jqgrid 显示订单。发布的订单应该有黄色背景,并且只打开操作按钮。 未发布的订单有白色背景、标准删除和自定义发布操作按钮。

操作列的colmodel:

{"hidden":false,"label":"Activity","name":"_actions","search":false,"width":94
,"sortable":false,"formatter":"actions","viewable":false,"formatoptions":{"editbutton":false,"onSuccess":function (jqXHR) { jqXHRFromOnSuccess=jqXHR;return true;}
,"delbutton":true,"delOptions":{"url":"http://localhost:52216/admin/Grid/Delete?_entity=DoklstlT","afterComplete":function (response, postdata, formid) { 
summarefresh($grid);
$grid[0].focus(); 
}
}}},

发布状态由布尔 Kinnitatud 列确定:

{"label":null,"name":"Kinnitatud","index":"Kinnitatud","editoptions":{"value":"True:False","readonly":"readonly","disabled":"disabled"},"template":"booleanCheckboxFa","editable":true,"width":0,"classes":null,"hidden":true,"searchoptions":{"sopt":["eq","ne"],"value":":Free;true:Yes;false:No"},"dataEvents":[{"type":"focus","fn":function(e) {if(typeof e.target.ischanged=='undefined') {e.target.ischanged=false}}
},"",{"type":"click","fn":function(e) {dataChanged(e.target)}
},{"type":"blur","fn":function(e) {summarefresh()}
}]}],

在其他网格发布状态由未发布文档未填充的 Kinkuup 列确定:

{"template":DateTemplate
,"label":null,"name":"Kinkuup","index":"Kinkuup","editoptions":{"dataInit":null,"size":10,"readonly":"readonly","disabled":"disabled"},"searchoptions":{"dataInit":initDateSearch
,"size":10,"attr":{"size":10}},"width":0,"classes":null,"hidden":true,"dataEvents":[]}],

两列都可以在网格中隐藏或可见。取决于用户的喜好。

在 loadComplete 中为所有行创建自定义操作按钮:

       loadComplete: function() {
            var iCol = getColumnIndexByName($(this),'_actions');
            $(this).children("tbody").children("tr.jqgrow")
               .children("td:nth-child("+(iCol+1)+")")
               .each(function() {

                   $("<div>",
                     {
                         title: "Confirm (F2)",
                         mouseover: function() {
                             $(this).addClass('ui-state-hover');
                         },
                         mouseout: function() {
                             $(this).removeClass('ui-state-hover');
                         },
                         click: function(e) {
                             resetSelection();
                             idsOfSelectedRows = [$(e.target).closest("tr.jqgrow").attr("id")];
                             $("#grid").jqGrid('setSelection', $(e.target).closest("tr.jqgrow").attr("id"), false);
                             $('#grid_postbutton').click();
                         }
                     }
                ) 
                 .addClass("ui-pg-div ui-inline-post")
                 .append('<span class="fa ui-state-default fa-fw fa-lock"></span>')
                 .prependTo($(this).children("div"));


                   $("<div>",
                       {
                           title: "Open (Enter)",
                           mouseover: function() {
                               $(this).addClass('ui-state-hover');
                           },
                           mouseout: function() {
                               $(this).removeClass('ui-state-hover');
                           },
                           click: function(e) {
                               openDetail($(e.target).closest("tr.jqgrow").attr("id"));
                           }
                       }
                    )
                     .addClass("ui-pg-div ui-inline-open")
                     .append('<span class="fa ui-state-default fa-folder-open-o"></span>')
                     .prependTo($(this).children("div"));

               }); 

使用 How to remove action buttons from posted rows in free jqgrid using Fontawesome checkbox formatter 中的代码有条件地删除按钮后,有条件地禁用行编辑并更改背景。

   disableRows('Kinkuup', false);
   disableRows('Kinnitatud', true);


 var disableRows = function (rowName, isBoolean) {
    var iCol = getColumnIndexByName($grid, rowName),
              cRows = $grid[0].rows.length,
              iRow,
              row,
              className,
              isPosted,
              mycell,
              mycelldata,
              cm = $grid.jqGrid('getGridParam', 'colModel'),
              iActionsCol = getColumnIndexByName($grid, '_actions'), l,
              isPostedStr;
    l = cm.length;
    for (iRow = 0; iRow < cRows; iRow = iRow + 1) {
        row = $grid[0].rows[iRow];
        className = row.className;
        if ($(row).hasClass('jqgrow')) {
            isPostedStr = $.unformat.call($grid[0], row.cells[iCol],
          { rowId: row.id, colModel: cm[iCol] }, iCol);
            //if (cm[iCol].convertOnSave) {
            //    isPosted = cm[iCol].convertOnSave.call(this, {
            //        newValue: isPostedStr,
            //        cm: cm[iCol],
            //        oldValue: isPostedStr,
            //        id: row.id,
            //        //item: $grid.jqGrid("getLocalRow", row.id),
            //        iCol: iCol
            //    });
            //}
            isPosted = isPostedStr !== "False" && isPostedStr.trim() !== "";

            if (isPosted) {
                if ($.inArray('jqgrid-postedrow', className.split(' ')) === -1) {
                    // todo: how to disable actions buttons and form editing:
                    row.className = className + ' jqgrid-postedrow not-editable-row';
                    $(row.cells[iActionsCol]).attr('editable', '0');
                    $(row.cells[iActionsCol]).find(">div>div.ui-inline-del").hide();
                    $(row.cells[iActionsCol]).find(">div>div.ui-inline-post").hide();
                    $(row.cells[iActionsCol]).find(">div>div.ui-inline-edit").hide();
                }
            }
        }
    }
};

如何使用免费的 jqgrid 操作选项来简化此代码?

如何创建统一的方式来隐藏标准的编辑和删除以及用户定义的操作按钮?即使自定义按钮创建可以使用回调有条件地禁用,隐藏标准按钮仍然需要 DOM 修改。也许以相同的方式定义所有操作按钮。 也许它可以使用现有的 rowattr 或 cellattr 回调或引入新的回调来完成。

当前行被设置为仅在下面的代码中使用

row.className = className + ' jqgrid-postedrow not-editable-row';
$(row.cells[iActionsCol]).attr('editable', '0');

这样做是否合理,以便可以完全删除 diableRows ? 也许可以用 rowattr() 代替这个。

【问题讨论】:

    标签: jquery jqgrid free-jqgrid


    【解决方案1】:

    我在formatter: "actions" 中进行了一些更改,以简化您的方案的实施。 The demo 展示了如何使用新功能。它显示如下图所示的网格

    该演示将colModel 中的Action 列定义为

    { name: "act", template: "actions", align: "left", width: 58 }, // 58 = 2 + 18*3 + 2
    

    它使用actionsNavOptions(也可以使用formatoptions)来配置formatter: "actions"的选项:

    actionsNavOptions: {
        editbutton: false,
        custom: [
            { action: "open", position: "first",
                onClick: function (options) {
                    alert("Open, rowid=" + options.rowid);
                } },
            { action: "post", position: "first",
                onClick: function (options) {
                    alert("Post, rowid=" + options.rowid);
                } }
        ],
        posticon: "fa-lock",
        posttitle: "Confirm (F2)",
        openicon: "fa-folder-open-o",
        opentitle: "Open (Enter)",
        isDisplayButtons: function (options, rowData) {
            if (options.rowData.closed) { // or rowData.closed
                return { post: { hidden: true }, del: { display: false } };
            }
        }
    }
    

    数组 custom 定义了动作名称、positiononClick 回调。要定义自定义按钮的图标和标题(工具提示),应指定靠近导航栏选项的选项。指定图标类的属性将由动作名称(上例中的openpost)构造,后缀"icon" 将以相同的方式定义按钮的标题属性值。

    回调isDisplayButtons 允许根据行的数据和rowid 通知jqGrid 按钮的显示。 options 参数与您从自定义格式化程序中知道的选项相同。 options.rowId 是例如 rowid。最新版本的免费 jqGrid(4.8 后)通过包含 rowData 扩展了选项。可以看到isDisplayButtons的第二个参数已经是rowData了。 options.rowDatarowData的主要区别在于数据的格式。在使用 XML 输入的情况下,rowData 参数是输入数据的 XML 项。另一方面,选项options.rowDataobject,在colModel 中具有类似name 属性的属性。特别是在使用带有 XML 数据的loadonce: true 场景的情况下,options.rowData 的使用具有优势。在上面的演示中options.rowDatarowData 是相同的。

    回调isDisplayButtons 应该返回与动作名称{ post: {...}, open: {...}, del: {...}, edit: {...}, save: {...}, cancel: {} } 具有相同属性的对象。每个这样的对象的属性可以是

    • hidden: true - 表示在列中包含按钮但使其隐藏。稍后可以显示该按钮。 savecancel 按钮默认隐藏。
    • display: false - 表示根本不包含按钮。例如,返回 del: {display: false} 与选项 delbutton: false 具有相同的效果,但 del: {display: false} 仅适用于一行。
    • noHovering: true 可用于移除指定操作按钮的悬停效果 (onmouseover="jQuery(this).addClass('ui-state-hover');" onmouseout="jQuery(this).removeClass('ui-state-hover');")。

    【讨论】:

    • 谢谢。这是工作。将 loadComplete row.className = className + ' jqgrid-postedrow not-editable-row'; $(row.cells[iActionsCol]).attr('editable', '0'); 中的行替换为 rowattr 以完全删除行上的循环是否合理?
    • 我使用远程 json 数据。 rowData.closed 未定义。 options.rowData.closed 包含正确的字符串值 True 或 False,因此我可以使用 options.rowData.closed
    • @Andrus:这绝对是合理的。 rowattr 作为loadComplete 中的循环总是更好。我建议您阅读我最近发布的the answer。在我看来,您的最后一个问题非常接近。
    • 按钮需要在两个地方定义:在数组内部和单独的两个属性中。保持它们同步是非常复杂的。为什么不在数组中移动图标和标题属性并使用固定名称。在这种情况下,按钮可以在一个地方定义:{ action: "open", title: "open", icon: "fa-folder-open-o", onClick: function (options) { alert("Open, rowid=" + options.rowid); } },
    • 也许isDisplayButtons 回调也应该为每个按钮分开并移动到数组中。如果使用具有不同显示条件的多个按钮,这可以简化代码。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-21
    • 2020-01-15
    • 2011-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多