php - JQGrid lädt Daten in einem anderen Raster mit OnSelectRow




jquery ajax (2)

Ich habe das selbe Problem selbst erlebt. Ich empfehle Ihnen, Ihr Gitter außerhalb der onSelectRow-Funktion mit dem Datentyp "local" zu definieren und nur die Teile zu ändern, die sich zwischen den einzelnen Ladevorgängen in onSelectRow ändern:

$("#checkpoint_grid").jqGrid('setGridParam', {
    url: null
}).jqGrid('setGridParam', {
    url: url + "&rid=" + rowid + "&type=" + itype,
    datatype: "json"
}).trigger("reloadGrid");

Normalerweise mache ich das mit postData: null , aber ich denke, das zugrunde liegende Problem ist, dass jqGrid einige Grid-Parameter zwischenspeichert.

Ich habe mir in den letzten Tagen die Haare ausgerissen. Genau wie ein kurzer Überblick über das Problem. Ich verwende JqGrid 4.2.0 (neueste Version zum Zeitpunkt des Schreibens). Auf einer einzigen Seite habe ich zwei Raster. Einer auf der linken Seite, der als Navigator fungieren soll. Ich möchte die Daten im rechten Raster mit Daten laden, die durch die Zeilen-ID des auf der linken Seite angeklickten Elements bestimmt werden.

Mein Problem ist, dass die erste ausgewählte Zeilen-ID "hängenbleibt" und alle zukünftigen Ajax-Aufrufe dieselbe identische Zeilennummer sind (zum Beispiel: wenn die erste ausgewählte Zeile 514 war, gibt jede andere ausgewählte Zeile 514 beim Ajax-Aufruf aus, um die andere zu laden) Raster, wenn zuerst ausgewählt wurde 513, alle anderen 513 usw.)

Ich vermute, es könnte sich um eine Art von Variablen handeln, oder ich habe während der Ausführung Alertaufrufe für Tests gesetzt, und alle alarmieren die korrekte ID-Nummer bis zu dem Punkt, an dem das nächste Grid geladen wird. An diesem Punkt wird die Zeilen-ID falsch .

Hier ist mein Code unten:

Das erste Segment ist die anfängliche Liste auf der linken Seite mit dem OnSelectRow-Aufruf, und der zweite Abschnitt des Codes ist für das Datenraster auf der rechten Seite, welches die Daten tatsächlich enthält.

renderImportsList = function(url, data, firstrow) {
var cnames = data.names;
var cmodel = data.model;
currentrow = firstrow;
$("#imports_grid").jqGrid({
    url: url + "&type=list",
    //caption: "Imports",
    datatype: "json",
    colNames: cnames,
    colModel: cmodel,
    recordtext: "<b>Imports: {1}</b>",
    autowidth: true,
    rowNum: 10000,
    toolbar: [true,"top"],
    pager: "#imports_grid_pager",
    pgbuttons: false,
    pginput: false,
    viewrecords: true,
    multiselect: false,
    sortorder: "desc",
    sortable: true,
    onSelectRow: function(rowid) {
        if (rowid != firstrow) {
            if ($("#" + firstrow).hasClass("ui-state-highlight"))
                $("#" + firstrow).removeClass("ui-state-highlight")
        }
        setTimeout(function() { 
            // Display import items
            var itype = "checkpoint";
                            alert(rowid); // This returns the right row ID so far
            renderImportItems(url, rowid, itype);
        }, 500);
    },
    loadComplete: function() {
        $("#imports_grid tr").css("border-color", "#666");
        $("tr.jqgroup").css("background", "#e9efff");
        $("tr.jqfoot").css("background", "#ced5e9");
        $("#imports_grid tr.jqfoot td").css("border-right", "none");
        $("#t_imports_grid").css("padding-bottom", "3px");
        $("#imports_grid").setSelection(firstrow, true);
        $("#imports_grid").trigger("reloadGrid"); // Call to fix client-side sorting
    }
});     
$("#imports_grid").jqGrid('navGrid','#imports_grid_pager',{edit:false,add:false,del:false,search:false});
$("#imports_grid").trigger("reloadGrid"); // Call to fix client-side sorting
sizeGrid("imports_grid");

}

Dieser Teil funktioniert gut, die Rowid in diesem Stadium ist das, worauf ich geklickt habe, entsprechend der obigen Warnung. Unten ist die zweite Funktion, die von innen OnSelectRow in der obigen Funktion aufgerufen wird.

renderImportItems = function(url, rowid, itype) {
$.ajax({
    url: srvrname + "applications/PMS/views/view/imports/" + itype + ".php",
    success: function(data) {
        var cnames  = data.names;
        var cmodel  = data.model;
                    alert(rowid); // Here, the code still executes the right row ID
        $("#checkpoint_grid").jqGrid({
            url: url + "&rid=" + rowid + "&type=" + itype,
            // This is where it breaks. No matter what, I keep getting rowid to equal whichever row was selected the very first time the grid was clicked (or loaded programatically onload)
            datatype: "json",
            colNames: cnames,
            colModel: cmodel,
            recordtext: "<b>Total: {1}</b>",
            autowidth: true,
            rowNum: 500,
            pager: "#" + itype + "_grid_pager",
            pgbuttons: false,
            pginput: false,
            viewrecords: true,
            multiselect: false,
            sortorder: "desc",
            sortable: true,
            loadComplete: function() {
                $("#" + itype + "_grid tr").css("border-color", "#666");
                $("tr.jqgroup").css("background", "#e9efff");
                $("tr.jqfoot").css("background", "#ced5e9");
                $("#" + itype + "_grid tr.jqfoot td").css("border-right", "none");
                $("#" + itype + "_grid").trigger("reloadGrid"); // Call to fix client-side sorting
            }
        }); 
        $("#" + itype + "_grid").jqGrid('navGrid','#' + itype + 'grid_pager',{edit:false,add:false,del:false,search:false});
        $("#" + itype + "_grid").trigger("reloadGrid"); // Call to fix client-side sorting
        sizeGrid(itype + "_grid");
    }
});

}

Wie Sie oben sehen können: an dem Punkt, an dem der erste Alarm aufgerufen wird; es gibt immer noch die korrekte ID-Nummer aus, aber sobald das zweite Gitter initialisiert ist; Die ID kehrt zu dem zurück, was beim ersten Aufruf automatisch eingestellt wurde.

Jede Hilfe wird sehr geschätzt. Wenn es hilft, hier sind einige FireBug-Ausgaben, um das Problem zu demonstrieren ...

(Domainname wurde aus Datenschutzgründen entfernt)

(Zuerst laden: programmatic: firstrow selected = 514) Antwort: //mydomain.com/views/view/grid.php?rid=514&type=checkpoint&_search=false&nd=1321336809180&rows=500&page=1&sidx=&sord=desc

(Geklickte Zeile: ausgewählte Zeile = 503) Antwort: //mydomain.com/views/view/grid.php?rid=514&type=checkpoint&_search=false&nd=1321336863994&rows=500&page=1&sidx=&sord=desc

(Angeklickte Zeile: ausgewählte Zeile = 510) Antwort: //mydomain.com/views/view/grid.php?rid=514&type=checkpoint&_search=false&nd=1321336864848&rows=500&page=1&sidx=&sord=desc


Ich denke die folgenden Schritte sollten funktionieren:

  1. Rufen Sie die onRowSelect-Funktion auf. Setzen Sie async: false für Ihren Ajax-Aufruf (optional) und rowid sollte als globale Variable beibehalten werden
  2. Laden Sie das 2. Gitter basierend auf den Primärschlüsseldaten aus dem 1. Gitter mit Hilfe von Dies neu






jqgrid