【问题标题】:jqGrid 4.10 autocomplete doesn't complete all fields + inline editing focus is not changing to a new rowjqGrid 4.10自动完成没有完成所有字段+内联编辑焦点没有改变到新行
【发布时间】:2015-12-02 16:14:41
【问题描述】:

首先:我有以下带有自动完成功能的列:

{name:'ISRC',index:'isrc.ISRC', width:100,align:"left",editable:true,
    edittype:'text',
    editoptions:{
        dataInit:function (elem) {
            var sel_row_id = $grid.jqGrid ('getGridParam', 'selrow');
            if (sel_row_id === undefined || sel_row_id === null) {sel_row_id="jqg1";}

            $(elem).autocomplete({
                source: "xtras/search_isrc.php",
                dataType: "json",
                minLength: 2,
                select: function(event, ui) {
                    console.log("EditOptions - "+sel_row_id);
//                              $("#"+sel_row_id+"_id").val(ui.item ? ui.item.isrc_ID : "");
                    $("#"+sel_row_id+"_ISRC").val(ui.item.ISRC);
                    $("#"+sel_row_id+"_Track_Name").val(ui.item.Track_Name);
                    $("#"+sel_row_id+"_Track_Time").val(ui.item.Track_Time);
                    $("#"+sel_row_id+"_ArtistName").val(ui.item.ArtistName);
                    $("#"+sel_row_id+"_Writer").val(ui.item.Writer);
                    $("#"+sel_row_id+"_Publisher").val(ui.item.Publisher);
                    $("#"+sel_row_id+"_TrackPLineYear").val(ui.item.TrackPLineYear);
                    $("#"+sel_row_id+"_TrackPLineInfo").val(ui.item.TrackPLineInfo);
                    $("#"+sel_row_id+"_isrc_id").val(ui.item.isrc_ID);
                    var ffs = ui.item.isrc_ID;
                    console.log("ffs - "+ffs);
                },
                change: function(event, ui) {
                    if (ui.item) {
                        $("#"+sel_row_id+"_ISRC").val(ui.item.ISRC);
                        $("#"+sel_row_id+"_Track_Name").val(ui.item.Track_Name);
                        $("#"+sel_row_id+"_Track_Time").val(ui.item.Track_Time);
                        $("#"+sel_row_id+"_ArtistName").val(ui.item.ArtistName);
                        $("#"+sel_row_id+"_Writer").val(ui.item.Writer);
                        $("#"+sel_row_id+"_Publisher").val(ui.item.Publisher);
                        $("#"+sel_row_id+"_TrackPLineYear").val(ui.item.TrackPLineYear);
                        $("#"+sel_row_id+"_TrackPLineInfo").val(ui.item.TrackPLineInfo);
                        $("#"+sel_row_id+"_isrc_id").val(ui.item.isrc_ID);
                    }
                }
            });
            $('.ui-autocomplete').css('zIndex',1000); // if autocomplete has misalignment so we are manually setting it 

            if(sel_row_id != 'jqg1'){
                $(elem).css({'border':'1px solid red','background-color':'#e8b7cf'});
            }
        }
    }
},
...
{name:'isrc_ID',index:'isrc.isrc_ID', hidden:true, width:50, sortable:true, editable:true},

ffs 输入控制台正确的 id 我还在 doubleClick 上设置了内联编辑:

ondblClickRow: function (rowid) {
    console.log('ondblClickRow - '+rowid);

    var savedRows = $grid.jqGrid("getGridParam", "savedRow");
    $grid.jqGrid("setSelection", rowid);

    if (savedRows.length > 0 && savedRows[0].id !== rowid) {
        // cancel editing of another row is editing
        // don't cancel on double click on the current editing
        $grid.jqGrid("restoreRow", savedRows[0].id);
    }
    if (savedRows.length === 0) {
        $grid.jqGrid("editRow", rowid, editOptions);
    } 
}

只有在我强制在此行上选择行$grid.jqGrid("setSelection", rowid); 后,我才能进行自动完成工作@

自动完成 PHP:

$sql = "select * from isrc where Track_Name REGEXP '[[:<:]]($q)[[:alnum:]]' or ISRC REGEXP '[[:<:]]($q)[[:alnum:]]' GROUP BY ISRC;"; 
$rsd = mysqli_query($GLOBALS["___mysqli_ston"], $sql); 
while($data = mysqli_fetch_array($rsd)) { 

    $row_array['value'] = $data['ISRC']; 
    $row_array['label'] = $data['ISRC'].' - '.$data['Track_Name'].' - '.$data['ArtistName'].' - '.$data['Track_Time'].' - '.$data['TrackPLineInfo'];

    $row_array['ISRC'] = $data['ISRC'];   
    $row_array['Track_Name'] = $data['Track_Name'];
    $row_array['ArtistName'] = $data['ArtistName']; 
    $row_array['Track_Time'] = $data['Track_Time'];
    $row_array['Writer'] = $data['Writer']; 
    $row_array['Publisher'] = $data['Publisher']; 
    $row_array['TrackPLineYear'] = $data['TrackPLineYear']; 
    $row_array['TrackPLineInfo'] = $data['TrackPLineInfo']; 
    $row_array['isrc_ID'] = $data['isrc_ID'];   

} 

((is_null($___mysqli_res = mysqli_close($conn))) ? false : $___mysqli_res); 

echo json_encode($row_array); 

在选择时自动完成看起来完全符合预期(正确填写所有字段) 提交到服务器以添加到数据库后,我得到了这个:

_REQUEST - 2015-12-02 17:00:13: 
Array
(
    [Catalogue] => 1958
    [ISRC] => GBCQV0200199
    [Disc_Number] => 1
    [Track_Number] => 4
    [is_bonus] => No
    [Track_Name] => Hitch Hiking Woman
    [ArtistName] => Peter Green Splinter Group
    [Track_Time] => 00:00:00
    [Writer] => Turner
    [Publisher] => Bug Music Ltd
    [TrackPLineYear] => 1997
    [TrackPLineInfo] => Snapper Music
    [isrc_ID] => 
    [id] => jqg1
    [copyID] => 
    [oper] => add
)

如您所见,[isrc_ID] =&gt; 为空白。我能想到的唯一解释 - 这是因为这个字段是隐藏的...... 我该如何解决这个问题?

其次:jqGrid - 添加时 - 如果在按 + 添加一行之前我选择/单击了任何其他现有行 - 网格认为我正在编辑新行 [id] =&gt; jqg1添加的。这是我的定义:

var editOptions = {
            keys: true,
            aftersavefunc: function() {
                var $self = $(this);
                setTimeout(function () {
                    $self.trigger("reloadGrid", [{current: true}]);
                }, 50);
            },
            url: "xtras/Records.php"
        },
        gridIdSelector = "#Records",
        pagerIdSelector = "#Records_pager",
        $grid = $(gridIdSelector);

和寻呼机启动:

.jqGrid("navGrid", pagerIdSelector, {add: false, edit: false, refreshstate: "current"})
        .jqGrid("inlineNav", pagerIdSelector, { editParams: editOptions, addParams: {addRowParams: editOptions}})
        .jqGrid("navButtonAdd", pagerIdSelector, {
            caption: "",
            title: "Copy selected row",
            id: $grid[0].id + "_ilcopy", 
            buttonicon: "ui-icon-copy",
            onClickButton: function () {
                var $self = $(this), p = $self.jqGrid("getGridParam"), rowData,
                    srcrowid = p.selrow, savedRows = p.savedRow;

                if (srcrowid !== null) {
                    if (savedRows.length > 0) {
                        // cancel editing
                        $self.jqGrid("restoreRow", savedRows[0].id);
                    }
                    rowData = $self.jqGrid("getRowData", srcrowid);
                    rowData.id = "";
                    rowData.Catalogue = "";
                    rowData.copyID = srcrowid;
                    $self.jqGrid("addRow", {
                        initdata: rowData,
                        addRowParams: editOptions 
                    });
                } else {
                    alert("Please select a row to copy");
                    return false;
                }
            }
        });

如何确保在内联编辑时完全重置先前的选择?

抱歉,我想不出为什么会出现这两种行为。如果您认为需要查看更多代码 - 请告诉我。

【问题讨论】:

    标签: jquery autocomplete jqgrid free-jqgrid


    【解决方案1】:

    我不确定我是否完全理解您使用自动完成功能描述的问题,但我想您希望如果之前选择了该行,该行将不取消选择。这是旧 jqGrid 的行为。您可以添加选项

    singleSelectClickMode: "selectonly"
    

    恢复旧的选择行为。

    我可以在您的代码中看到一些其他问题。 Free jqGrid 已经实现了对dataInit 回调的扩展。它有第二个参数options,它具有以下有用的属性:

    • rowId 的值类似于 "70"
    • name 以列名作为值,例如"invdate"
    • id 的值类似于 "70_invdate"
    • mode 的值类似于 "edit""add"

    此外,DOM 元素elem 已经放置在页面上,您可以使用$(elem).closets("tr.jqgrow").attr("id") 之类的东西来获取rowid。最好使用options.rowId of cause 作为表达式$(elem).closets("tr.jqgrow").attr("id")

    因此我建议您更改代码的开头

    dataInit:function (elem) {
        var sel_row_id = $grid.jqGrid ('getGridParam', 'selrow');
        if (sel_row_id === undefined || sel_row_id === null) {sel_row_id="jqg1";}
        ...
    }
    

    dataInit: function (elem, options) {
    

    并在下面使用options.rowId 而不是sel_row_id。我必须强调分配sel_row_id="jqg1" 是错误的。它可以在添加第一行时正常工作,但在添加下一行的情况下肯定会出错。

    dataInit的代码末尾建议你替换

    if(sel_row_id != 'jqg1'){
    

    if (options.mode !== "add") {
    

    更新:我想您需要使用editable: "hidden" 属性而不是editable: true 来代替isrc_ID。你需要改变

    $("#" + options.rowId + "_isrc_id").val(ui.item.isrc_ID);
    

    $grid.jqGrid("setCell", options.rowId, "isrc_ID", ui.item.isrc_ID)
    

    因为将editable: true 用于隐藏 字段不会创建任何隐藏的&lt;input&gt; 元素。

    我引入了选项editable: "hidden" 属性以提供简单的方法来将任何附加列发送到不可编辑的服务器。值得一提的是,editable: "hidden" 内联和单元格编辑功能 仅在 4.11.0 版本的 jqGrid 中实现。我建议您从 GitHub 加载与 4.11.0 相同的当前源代码,但其中还包含一个重要修复。我将在本周末发布 4.11.1。

    【讨论】:

    • 你好!好的理解和改变。但是为什么$("#"+sel_row_id+"_isrc_id").val(ui.item.isrc_ID); 没有填写从source: "xtras/search_isrc.php" 发送的值?我该如何解决?
    • @Elen:我不完全理解你的情况。通常,使用可以调试的演示可以轻松回答此类问题。我什至不知道你为什么同时使用selectchange 回调,你使用哪个测试用例,你使用哪个jQuery UI 版本,ui.item 看起来如何,是否具有所有属性,...我写信告诉你在自动完成中使用sel_row_id 是不安全的。你把它改成options.rowId了吗? ...
    • 是的,我确实更改为options.rowId 它仍然无法正常工作。现在不用担心change。我曾经将它用于添加和编辑,但现在可能可以省略它。还不确定。
    • 选择后的ui.item是这样的:Object {value: "GBCQV0200302", label: "GBCQV0200302 - Cyphered - Asgaroth - 00:02:29 - Peaceville Records Ltd", ISRC: "GBCQV0200302", Track_Name: "Cyphered", ArtistName: "Asgaroth"…} ArtistName: "Asgaroth" ISRC: "GBCQV0200302" Publisher: "" TrackPLineInfo: "Peaceville Records Ltd" TrackPLineYear: "2002" Track_Name: "Cyphered" Track_Time: "00:02:29" Writer: "" isrc_ID: "535" label: "GBCQV0200302 - Cyphered - Asgaroth - 00:02:29 - Peaceville Records Ltd" value: "GBCQV0200302" __proto__: Object
    • - 如您所见 isrc_ID: "535" - 确实存在。但是当我按 Enter 接受新记录时没有传递给服务器(我在我的问题中放了我的$_REQUEST var 的转储。我会试着做一个小提琴......但我总是对如何处理 ajax 有疑问因为我正在开发的网站仅供内部使用...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-07
    • 2023-03-05
    • 2013-07-01
    • 1970-01-01
    相关资源
    最近更新 更多