Was ist das Äquivalent zu ng-grids "beforeSelectionChange" in ui-grid?

8

In ng-grid habe ich beforeSelectionChange folgendermaßen verwendet:

Wenn der Benutzer eine Zeile auswählt, wird ein Ajax-Aufruf ausgeführt. Während der Ajax-Aufruf geschieht, setze ich $scope.doingAjaxCall = true , und um zu verhindern, dass der Benutzer die Auswahl ändert, hatte ich dies in der Rasterdefinition:

%Vor%

sperrt / fixiert die Auswahl, wenn der Ajax-Aufruf stattfindet.

Nun, in ui-grid (aka ng-grid 3), Ich weiß nicht, was das für afterSelectionChange ist.

In diesem Abschnitt der Dokumentation:
Ссылка
Ich sehe zwei Ereignisse:

  • rowSelectionChanges
  • rowSelectionChangedBatch .

Dies scheint das Äquivalent des alten afterSelectionChange

zu sein

Und in diesem Abschnitt der Dokumentation:
Ссылка
Ich sehe diese zwei Methoden, die mit der Notwendigkeit zu tun scheinen:

  • raiseSelectionEvent(grid, changedRows, event)
  • decideRaiseSelectionEvent(grid, row, changedRows, event)

Aber ich verstehe nicht, wie man sie benutzt

Wichtiger Hinweis:
Ich verwende multiSelect: false (dh: nur eine Zeile kann ausgewählt werden)

    
sports 19.08.2015, 16:32
quelle

2 Antworten

0

Dies ist ein bisschen ein Hack, aber es wird die Arbeit erledigt, bis Sie eine bessere Lösung finden. Hier ist ein funktionierender Plocker .

Ich nehme an, dass Sie rowSelectionChanged verwenden, um den AJAX-Aufruf durchzuführen und doingAjaxCall umzuschalten.

%Vor%

Ändern Sie dann die Vorlage, die ui-grid für die Auswahlschaltflächen verwendet.

%Vor%

Auf diese Weise wird $scope.clickConditions() ausgewertet, bevor die tatsächliche Klicklogik aufgerufen wird. Wenn es falsch ist, wird selectButtonClick , das die interne Auswahllogik behandelt, niemals aufgerufen.

%Vor%

Wie ich schon sagte, das ist sehr hacky! Es gibt bessere Möglichkeiten, die Templates zu überschreiben (zB ui-grid/selectionRowHeaderButtons ), beim Überschreiben von Templates müssen Sie die Logik überprüfen Beim Aktualisieren sollten Sie den Benutzer wahrscheinlich wissen lassen, dass etwas passiert, visuell , wenn der AJAX-Anruf ausgeführt wird, usw.

Eine bessere Lösung wäre es, das Repo auszugeben und Ihre eigene beforeSelectionChange -Logik hinzuzufügen (wahrscheinlich beginnt hier ). Aber es sieht so aus, als ob du anderswo nicht viel Hilfe bekommen hast, also hoffe, dass dir das wenigstens gelingt!

    
lebolo 26.10.2015 15:23
quelle
0

ui-grid bietet die Werkzeuge, um dies zu tun, ich bin mir nicht sicher, ob es ein "ui-grid" Weg gibt, aber es gibt definitiv Möglichkeiten, dies zu tun, die kompatibel sind.

Ausgehend von Ihrer Beschreibung gehe ich davon aus, dass Sie nur eine einzige Auswahl zulassen, denn wenn Sie Mehrfachauswahl zulassen, können sie weiterhin Auswahlen hinzufügen und den Ajax im Hintergrund ausführen. Ich nehme an, dass Sie multiSelect: false pro Ссылка

festlegen

Ich kann zwei Möglichkeiten sehen, um das Ergebnis zu erhalten:

  1. Wenn der Benutzer versucht, eine Zeile auszuwählen, während ein Ajax-Anruf ausgeführt wird, setzen Sie die Auswahl zurück auf den ursprünglichen Wert. Das bedeutet, dass Sie die Ereignisse selectionChanged und selectionChangedBatch anhören, die gewünschte Auswahl verfolgen und den Verlauf eines Ajax-Anrufs verfolgen müssen.

  2. Verwenden Sie eine Funktion isRowSelectable , bei der keine Zeile ausgewählt werden kann, wenn ein Ajax-Aufruf ausgeführt wird. Die Funktion selbst ist ähnlich wie bei ng-grid, also return !$scope.doingAjaxCall . Der Unterschied besteht darin, dass Sie notifyDataChange aufrufen müssen, wenn Sie den Wert von $scope.doingAjaxCall ändern. Aus dem Speicher kann eine Zeile, die vom Benutzer nicht ausgewählt werden kann, trotzdem im Code ausgewählt werden - das ändert nichts daran, dass die Zeile ausgewählt ist.

Ich würde wahrscheinlich mit der zweiten Option gehen.

Hinzufügen von Informationen wie gewünscht: isRowSelectable ist im Tutorial wie oben erwähnt (es gibt ein Beispiel dafür). Der einzige Trick besteht darin, dass ich das Gefühl habe, dass es nur bei bestimmten Ereignissen neu ausgewertet wird, sodass es nicht automatisch die Auswahl aus jedem Element entfernt, wenn Sie die Variable doingAjaxCall ändern. Daher empfahl ich den Aufruf von notifyDataChange , was auch im Tutorial ist.

Ich würde vorschlagen, dass Sie es in einem Plunder versuchen, und wenn Sie dann Schwierigkeiten haben, kann ich schauen und Rat geben. Ich habe jetzt nicht die Zeit, es von Grund auf neu zu schreiben.

    
PaulL 18.11.2015 19:16
quelle