jQuery - jqGrid - unerwünschtes Verhalten in onSelectRow Veranstaltung
Ich hatte eine Vorherige Frage Bezug mit Knöpfen in jeder Reihe ein jqGrid, die aktiviert werden würde, wenn die Zeile ausgewählt wurde. Mit Hilfe von @Oleg
ich war in der Lage, um es an die Arbeit, wie ich dachte, es sollte.
In weiteren Tests habe ich jedoch erkannt, unerwünschtes Verhalten in diesem onSelectRow
Veranstaltung. Was ich fand, war, dass wenn ich ein raster mit 3 Zeilen, und ich klicken Sie auf die Zeile 2 (aktiviert, die Tasten), dann (ohne zu klicken auf die Zeile 2 buttons) klicken Sie auf Zeile 3 (die deaktiviert Zeile 2 Tasten & aktiviert Zeile 3 Tasten), und ändere meine Meinung wieder & klicken Sie auf Zeile 1 oder 2 (egal), und bei , DASS Punkt, dann klicken Sie auf die "Re-Send"
(senden) - Taste, was passiert, ist, dass die ausgewählte Zeile wird dann erneut gesendet, 3 separate Zeiten.
Folgenden werden die timestamps von 4 Zeilen, die geschrieben wurden, von 1 "Erneut Senden" klicken Sie auf gestern.
2013-05-28 16:49:04.817
2013-05-28 16:49:04.653
2013-05-28 16:49:04.560
2013-05-28 16:49:04.467
Habe ich einige der Protokollierung in der Seite & bestätigt, dass es tut, rufen Sie die POST 4 separate mal, einmal für jeden Klick auf eine Zeile im raster.
Die folgenden Abschnitte enthalten die meisten der Konfiguration/Einstellungen, die ich derzeit habe, wo das jqGrid gebaut wird.
colNames: ["Destination", "Message Text", "Send Time","Message Action"],
colModel:[
{name:"Destination",index:"Destination",width:col1width,align:"left", xmlmap:"Rowset>Row>Destination",sortable:false},
{name:"MessageText",index:"MessageText",width:col2width,align:"left",xmlmap:"Rowset>Row>MessageText",sortable:false},
{name:"SendTime",index:"SendTime",width:col3width,align:"center",formatter:"date",formatoptions: {"srcformat":"ISO8601Long", "newformat":"Y-m-d H:i:s"},xmlmap:"Rowset>Row>SendTime",sortable:false},
{name: "msgAct",
width: col4width,
align: "center",
formatter: function() {
return "<input name='resendMsg' style='height:25px;width:65px;' type='submit' value='Re-Send' disabled='disabled' />" +
"<input name='cancelMsg' style='height:25px;width:55px;' type='submit' value='Cancel' disabled='disabled' />"
}}
],
viewrecords: true,
caption: capMsg,
rownum: 0,
height: "100%",
width: gridwidth,
toolbar: [true, "top"],
pager: jQuery("#pager1"),
sortname: "SendTime",
hidegrid: false, //hides the ability to collapse grid
defaults: {
altrows: true,
recordtext: "View {0} - {1} of {2}",
emptyrecords: "No records to view",
loadonce: true,
pgtext: "Page {0} of {1}"
},
Folgenden ist die onSelectRow
Veranstaltung.
onSelectRow: function(id) {
var tr = $(this).jqGrid("getInd",id,true);
var gridRow = $(this).jqGrid("getRowData",id);
var srow = $(this).jqGrid("getGridParam","selrow");
//disable all resendMsg & cancelMsg buttons in the grid
$(this).find("input[name=resendMsg]").attr("disabled","disabled");
$(this).find("input[name=cancelMsg]").attr("disabled", "disabled");
//now enable the buttons for the current row only
$(tr).find("input[name=resendMsg]").removeAttr("disabled");
$(tr).find("input[name=cancelMsg]").removeAttr("disabled");
//disable dropdowns & sendMsg submit button
//catch the Cancel button click
$(tr).find("input[name=cancelMsg]").click(function() {
//disable all resendMsg & cancelMsg buttons in the grid
$(this).find("input[name=resendMsg]").attr("disabled","disabled");
$(this).find("input[name=cancelMsg]").attr("disabled", "disabled");
//enable the dropdowns & clear the selection, reload grid
ReloadGrid();
});
//catch the Re-Send button click
$(tr).find("input[name=resendMsg]").click(function() {
ReSendMessage(gridRow.Destination, gridRow.MessageText);
//disable all resendMsg & cancelMsg buttons in the grid
$(this).find("input[name=resendMsg]").attr("disabled","disabled");
$(this).find("input[name=cancelMsg]").attr("disabled", "disabled");
//enable the dropdowns, clear the selection and exit
$("#myGrid").jqGrid("resetSelection");
});
},
und der Rest der jqGrid-code:
gridview: true,
xmlReader: {
root: "Rowsets",
row: "Row",
repeatitems: false,
id: "SendTime"
},
loadComplete: function() {
//increase row height
$("td",".jqgrow").height(40); //data grid rows
//alternate background of every other row
$("tr.jqgrow:odd").css({"background-color": "#DDDDDC", "background-image": "none"});
$("th.ui-th-column").css("font-weight","bold");
}
});
Es ist wie die onSelectRow Ereignis häufen sich die Anzahl der Klicks & dann Aufruf der click-Ereignis-Funktionen jedoch oft eine Zeile ausgewählt wurde aber ein button nicht geklickt.
Habe ich ausprobiert, aber, dass, wenn ich auf eine Zeile klicken, und klicken Sie dann auf die submit-buttons, die it-Prozesse wie zu erwarten (eine "Re-Send
" legt die Zeile 1 mal, und ein "Cancel
" löscht die Auswahl & macht nichts anderes).
Ich weiß nicht, ob es möglich ist, aber kann man verhindern, dass eine nachfolgende onSelectRow
von feuern, wenn eine Zeile schon ausgewählt? Können Sie deaktivieren Sie die Vorherige Auswahl (oder zurücksetzen), um zu verhindern, dass die onSelectRow
(und das click-Ereignis für die Schaltfläche) aus feuern mehrere Male?
Ich würde schätzen alle Gedanken, Kommentare oder Vorschläge, wie man um dieses Verhalten zu beheben.
BEARBEITEN
Einschließlich der code für beforeSelectRow
wie bereits in einer Antwort weiter unten.
$("#myGrid").bind("jqGridBeforeSelectRow", function(e, id, eventOriginal) {
var gsr = $("#myGrid").jqGrid("getGridParam","selrow");
console.log(" **** beforeSelectRow - (before if) lastSel = " + lastSel + " id = " + id + " gsr = " + gsr);
if (id && id !== lastSel) {
console.log("id && id !== lastSel");
console.log(" id = " + id + " lastSel = " + lastSel);
};
if (id !== lastSel) {
if (lastSel == -1) { //first time thru
lastSel = id;
console.log(" **** beforeSelectRow - first time thru - new val = " + lastSel + " gsr = " + gsr);
return true;
}
else {
console.log(" **** beforeSelectRow - lastSel - " + lastSel + " <> id = " +id + " gsr = " + gsr);
return false;
}
}
else {
console.log(" **** beforeSelectRow - otherwise they matched - lastSel = " + lastSel + " id = " + id + " gsr = " + gsr);
return true;
}
});
Nach dem Umzug der .click
Ereignis aus der onSelectRow
in die loadComplete
(für die Schaltfläche Abbrechen als test), ich habe versucht den obigen code innen & außen der code für das grid. Es führt die gleichen in beiden Fällen.
Das Problem ist, dass die Cancel
button soll zum zurücksetzen der Auswahl $("#myGrid").resetSelection();
und laden Sie die raster. Der code wird ausgeführt, & nicht ein Fehler, sondern das nächste mal beforeSelectRow
feuert (wenn das grid neu geladen wird), die id ist noch die gleiche, wie es war, als beforeSelectRow
und onSelectRow
ausgelöst, wenn ich klickte auf die Reihe, was bedeutet, dass ich nie wählen Sie eine neue Zeile, bis die gesamte Seite neu geladen wird. Nur auf der Seite geladen ist, wenn beforeSelectRow
nicht ausgelöst.
BEARBEITEN
Folgenden ist der code für die Schaltfläche "Abbrechen", jetzt befindet sich im inneren des loadComplete
Veranstaltung.
//catch the Cancel button click
$(this).find("input[name=cancelMsg]").click(function() {
//disable all resendMsg & cancelMsg buttons in the grid
$(this).find("input[name=resendMsg]").attr("disabled","disabled");
$(this).find("input[name=cancelMsg]").attr("disabled", "disabled");
//enable the dropdowns & clear the selection, reload grid
console.log("ReloadGrid (inside Cancel function) ");
lastSel = -1;
$("#myGrid").trigger("reloadGrid");
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es ist falsch, zu bind-Taste (zu verwenden
.click
) innerhalb vononSelectRow
Rückruf.Statt) können Sie den code bei der Registrierung
click
event-handler innerhalb vonloadComplete
. Sie können bewegen Sie einfach den code ausonSelectRow
zuloadComplete
und ersetzen$(tr)
zu$(this)
Suche innerhalb von alle Tasten des Rasters und nicht nur die Tasten der ausgewählten Zeile. Sie können weiterhin setzen oder entfernendisabled
Attribut innerhalbonSelectRow
Rückruf.Besser wäre keine individuelle Anpassung für jeden button. Man kann nur verwenden
onCellSelect
oderbeforeSelectRow
wird aufgerufen, ausclick
handler gebunden auf ganze raster. Sehen die Antwort und diese eine für code-Beispiele.AKTUALISIERT: ich bin nicht sicher, ob ich das richtig verstehe ist dein problem, aber ich hoffe, dass die demo zeigen wird, die Lösung des Problems. Ich nicht verwendet, eine explizite
click
handler. Die wichtigste änderung (das könnte dann wichtig, wenn Sie verwenden Internet Explorer) hinzufügenclass='cbox'
an den Formatierer zu verhindernreturn
im die Zeile von jqGrid-code. Der wichtigste Teil des Codes ist unterKann man ersetzen, Alarme innerhalb von
beforeSelectRow
zu den Maßnahmen, die Sie benötigen..click
in dieloadComplete
geholfen zu haben, es bekommen nur einmal aufgerufen. Jedoch habe ich bemerkt, dass dierowID
ist noch der Wert war es, und ist es nicht zurücksetzen, auch wenn ich rufe$("#myGrid").ResetSelection();
aus dem inneren der.click
event-handler, verschoben in dieloadComplete
. Das bedeutet, dass, wenn ich die 3 Zeilen angezeigt & wählen Sie die Zeile 3, dann drücken Sie die Abbrechen-Taste auf die Zeile, diebeforeSelectRow
noch Zeile 3 die id in es & wenn ich die Seite neu laden, kann ich nie wählen Sie eine beliebige andere Zeile, bis die Seite neu geladen wird. Ich habe diebeforeSelectRow
code oben.beforeSelectRow
, aber der code, mit dem Sie posierte enthalten keine trigger reloadGrid. Könnten Sie den code, zeigt wie Sie dies tun? Rufen Sie trigger reloadGrid innerhalb vonsetTimeout
? Setzen Sie Variablen wielastSel
vor dem zurückladen? Ich verstehe nicht, einige Teile des Codes, die du gepostet hast. Warum Sie den Zugangselrow
innerhalb vonjqGridBeforeSelectRow
anstelle der Verwendungid
parameter?setTimeout
. VariablelastSel
wird auf -1 gesetzt, innerhalb der Abbrechen-klicken Sie auf Ereignis. Dieselrow
innerhalb derjqGridBeforeSelectRow
wird für Informationen verwendet, die in derconsole.log
Aussagen. Ich war anzeigenid
imbeforeSelectRow
und konnte sehen, dass es nicht zurückgesetzt wird -selrow
gerade angezeigt wurde, um mir zu zeigen, dass die ausgewählte Zeile hatte zwar schon zurückgesetzt. Ich bin mir nicht sicher, wie dieid
bekommt zurücksetzen.onSelectRow
feuert jedes mal, wenn das grid lädt nach dem ersten mal. Ich nahm Ihren Vorschlag & zog Sie den button Aktionen in derbeforeSelectRow
. Einige der code, den ich ausgelassen war die Deaktivierung dropdown-Boxen in denonSelectRow
. Da (nach dem ersten mal)onSelectRow
feuert jedes mal, wenn Sie nie wieder aktiviert (wie das grid). DaonSelectRow
feuert, denke ich, dass ich brauche, um zu erkennenselected
auch. Gedanken? Danke nochmals für ALLE für Ihre Hilfe!onSelectRow
im inneren des senden/Abbrechenif
Aussagen inbeforeSelectRow
. Dort, würde ich wieder aktivieren, was vorher deaktiviert, und deaktivieren Sie alles, was aktuell aktiviert ist, setzen Sie die Auswahl und laden Sie dann die Gitter. Danach (noch innerhalb derif resend
oderif cancel
) ich würde zurückfalse
ausbeforeSelectRow
. Nicht fertig, es zu testen, aber es scheint zu tun, was ich verlange. vielen Dank nochmal für all Eure Hilfe!!onSelectRow
abgefeuert wird, durch das laden der raster. Wenn Sie die Wirkung haben, die Sie sollten überprüfen Sie Ihren code, wo Sie explizit auswählen einer Zeile.onSelectRow
undbeforeSelectRow
zu sehen, was passiert. Beim laden der Seite, keineonSelectRow
gefeuert. Allerdings, wenn ich eine Zeile markiert, egal ob ich getroffenRe-Send
oderCancel
-onSelectRow
würde immer Feuer. Was ich am Ende tun war, wennRe-Send
oderCancel
- Taste gehandhabt wurde, in derbeforeSelectRow
war wo ich das Neuladen des grid & hatte es wieder FALSE. AnsonstenbeforeSelectRow
würde return TRUE. Nochmals vielen Dank!