JQGrid和JQuery自动完成

时间:2012-10-15 18:58:35

标签: javascript jquery jquery-ui jqgrid autocomplete

实现JQGrid 4.3.0,Jquery 1.6.2和JQuery UI 1.8.16时,我遇到了内联编辑的问题。激活内联编辑后,会为某些元素分配一个自动完成。当内联编辑被取消或保存时,自动完成并不总是消失(通过双击然后点击删除选择文本,然后点击转义退出行编辑)。在编辑模式下不再考虑行时,将自动完成控件保留在编辑模式中。

也许您可以告诉我初始化是否存在问题,或者您是否知道“afterrestorefunc”之后的事件可以将字段恢复为“原始”状态。原始状态显示为JQGrid行中的数据。

我尝试在行关闭后删除DOM,.remove()和.empty():

 ... 
"afterrestorefunc": function(){ 
    $('.ui-autocomplete-input').remove();  }
...

但是这会导致其他问题,例如jqgrid在序列化数据行或编辑时无法找到单元格,并且需要刷新页面而不仅仅是jqgrid才能再次查看数据从那一行开始。

双击该行时会创建该元素的自动完成功能:

function CreateCustomSearchElement(value, options, selectiontype) {
...
            var el;
            el = document.createElement("input");
            ...
            $(el).autocomplete({
                source: function (request, response) {
                    $.ajax({
                        url: '<%=ResolveUrl("~/Services/AutoCompleteService.asmx/GetAutoCompleteResponse") %>',
                        data: "{ 'prefixText': '" + request.term + "', 'contextKey': '" + options.name + "'}",
                        dataType: "json",
                        type: "POST",
                        contentType: "application/json; charset=utf-8",
                        success: function (data) {
                            response($.map(data.d, function (item) {
                                    return {
                                        label: Trim(item),
                                        value: Trim(item),
                                        searchVal: Trim(item)
                                    }

                            }))
                        }
                    });
                },
                select: function (e, item) {
                    //Select is on the event of selection where the value and label have already been determined.                        
                },
                minLength: 1,
                change: function (event, ui) {
                    //if the active element was not the search button                      
                    //...                       
                }
            }).keyup(function (e) {
                if (e.keyCode == 8 || e.keyCode == 46) {
                    //If the user hits backspace or delete, check the value of the textbox before setting the searchValue                
                    //...
                }
            }).keydown(function (e) {
                //if keycode is enter key and there is a value, you need to validate the data through select or change(onblur)
                if (e.keyCode == '13' && ($(el).val())) {
                    return false;
                }
                if (e.keyCode == '220') { return false }
            });
        }

其他来源: http://www.trirand.com/jqgridwiki/doku.php?id=wiki:inline_editing

http://api.jqueryui.com/autocomplete/

更新 我尝试仅在元素聚焦时创建自动完成,并在onblur时删除它。这也没有解决问题。它似乎只需要触发自动完成下拉列表。

1 个答案:

答案 0 :(得分:0)

在调用自动​​完成之前,我有自定义启用/禁用功能。这会导致对同一jqgrid单元的多个引用调用导致冲突。 因此,在我应该打开内联编辑的行上的双击事件期间。根据记录类型,对该行进行分析并分析需要启用/禁用的单元。它确定关联数组可用的字段,从页面加载期间的代码序列化为隐藏字段值。

function tableRowDoubleClick(id, iRow, iCol, e) {
...
setCellEditabilityByRecordType(id);
...    
}

Cell可编辑性通过以下方式设置:

 function setCellEditabilityByRecordType(id) {
//change some of the fields to read-only
var grid = $('#mygrid');
var i;
var cm;
var cellRecordType = grid.jqGrid('getCell', id, 'RecordType')
//Determine Fields Disabled by evaluation of data from a hidden field.
var disablefields = eval(pg_FieldDisable[cellRecordType]);
for (i = 0; i < disablefields.length; i++) {
cm = grid.jqGrid('getColProp', disablefields[i]);
cm.editable = false;
}
...
}
...

因此,当行的初始设置对双击做出反应时,将设置单元格可编辑性。然后“CreateCustomSearchElement”触发。

但是,如果用户双击该行,则会再次触发双击,设置单元格可编辑性,但对于同一行。因此,这导致对单元格的多次引用,此时,我不确定发生了什么。我所知道的是,我必须将行可编辑性集中到一个函数,或者找到一种方法来读取双击的当前行是否真的需要再次设置可编辑性。

<强>参考 JavaScript关联数组:http://blog.xkoder.com/2008/07/10/javascript-associative-arrays-demystified/