2012-02-03 57 views
1

我使用jqGrid在页面上构建自定义内联条目小部件。在jqjGrid设置的相关部分是:jqGrid自定义输入元素需要父表处理

colModel:[ { 
     // Other columns removed. 
    {name:'ship',index:'ship', width:90, editable: true, sortable: false, 
      edittype: "custom", 
      editoptions:{ custom_element: customElement, 
          custom_value: customValue} } 
    ], 

我的回调函数是:

function customElement(value, options) { 
    var a = $("<input>").attr({ 
       type: 'text', 
       size: 2, 
       value: value, 
       style: 'float: left' 
     }).add(
      $("<span>").attr({ 
       style: 'float: left; margin-top: 2px;', 
       'class': 'ui-icon ui-icon-search' 
     }).click(function() { 
        // My custom function here. 
      }) 
     ).appendTo($("<div>")); 

    return a; 
} 

这一切都正常工作。

但是,我正在建立一个库来管理页面上的几个jqgrid表。我想使用相同的函数在几个这样的表上构建自定义元素。问题是这个特定的函数需要知道它正在处理哪个jQuery表。

我可以在customElement开始通过哈克的方式获得表ID,并在关闭它传递给函数:

var fieldID = options.id; 
var rowID = fieldID.replace(/_.*/, ""); 
var containingTable = $("#" + rowID + "_id").closest("table"); 

但这是假设列“ID”在当前的jqGrid存在,它是较早的(向左)列。我无法使用“发货”栏,因为它尚未创建。我不能假设表中有其他行也会有“发货”列。

我该如何在custom_element处理程序中可靠地获取“调用”表的句柄?

回答

1

我同意这是jqGrid的当前代码中的一个问题。没有简单而优雅的方式来获取创建控件的网格的id。

您已经建议了一种解决方法。我可以建议你多一个版本来获得“调用表”的ID。

自定义元素可用于每种编辑模式:内联编辑,表单编辑和单元格编辑。该click处理接收Event objecte

.click(function(e) { 
    // My custom function here. 
}) 

,你可以检测到“主叫网格”的ID。在线编辑或单元格编辑的情况下,检测是最容易的。这将是

.click(function(e) { 
    var $grid = $(e.target).closest('table.ui-jqgrid-btable'); 
    ... 
}) 

里面的形式编辑的click事件处理程序,你可以使用

.click(function(e) { 
    // you can do the following 
    var $t = $(e.target).closest('table.EditTable'), 
     tid = $t.attr('id'); // id=TblGrid_list 
    if (typeof tid === "string" && tid.substr(0, 8) === 'TblGrid_') { 
     var gridId = tid.substr(8); 
    } 
    var grid = $('#' + $.jgrid.jqID(gridId)); 

    // or the following 
    var $f = $(e.target).closest('form.FormGrid'), 
     fid = $f.attr('id'); // id=FrmGrid_list 
    if (typeof fid === "string" && fid.substr(0, 8) === 'FrmGrid_') { 
     var grid_id = tid.substr(8); 
    } 
    var mygrid = $('#' + $.jgrid.jqID(grid_id)); 
    ... 
}) 

上面的代码使用编辑表单包含IDS将根据构造两个元素的事实网格ID:如果网格ID =“列表”且<form>元素具有ID =“FrmGrid_list”,则编辑表单中的<table>元素具有id =“TblGrid_list”。

$('#' + $.jgrid.jqID(gridId))的使用与$('#' + gridId)更安全,因为在网格ID包含meta characters的情况下,它会给出正确的结果。 jqID功能非常简单(请参阅here)。它只是逃避在jQuery选择器中使用的meta characters