Mam listę studentów, którą powinienem wyświetlić użytkownikowi na stronie internetowej w formacie tabelarycznym.
Elementy są przechowywane w DB wraz z informacjami SortOrder.
Na stronie internetowej użytkownik może zmienić kolejność na liście, przeciągając i upuszczając elementy do pożądanej kolejności sortowania, podobnie jak w tym poście .
Poniżej zrzut ekranu mojej strony testowej.
W powyższym przykładzie do każdego wiersza dołączone są informacje o kolejności sortowania. Kiedy upuszczam John Doe (Student Id 10) powyżej wiersza Student Id 1, kolejność na liście powinna teraz wynosić: 2, 10, 1, 8, 11.
Jaki jest optymistyczny (mniej wymagający zasobów) sposób przechowywania i aktualizowania informacji o sortowaniu?
Moim jedynym pomysłem na razie jest to, że przy każdej zmianie kolejności sortowania listy wartość SortOrder każdego obiektu powinna być aktualizowana, co moim zdaniem jest bardzo wymagające zasobów.
Tylko do twojej wiadomości: Mogę mieć maksymalnie 25 wierszy w mojej tabeli.
Odpowiedzi:
Pomyślałem o czymś, co może ograniczyć twoje zapytania. Tutaj w moim przykładzie dodałem nowy
column
do sortowania o nazwiepos
. Tak więc początkowo bez przeciągania twój stół będzie wyglądał jak -Rozważmy teraz, że przeciągnąłeś
Item 4
pomiędzyItem 1
&Item 2
. Teraz nowapos
wartość dlaItem 4
będzie(20 + 10) / 2
, czyli jest15
. Musisz więc zaktualizować tylko jeden wiersz w bazie danych. I dostaniesz -Oto schemat blokowy ze skrzynkami brzegowymi.
i
to nowy indeks tablicy wiersza po przeciągnięciu -Ten schemat blokowy nie obsługuje
ArrayOutOfBound
czeków. A w przypadkach krawędzi potrzebujesz więcej niż jednego zapytania.Ponieważ masz tylko 25 wierszy, możesz wziąć bardzo dużą wartość (np.
10,000
) Dla różnicy pozycji (wziąłem10
dla tego przykładu). Im większa wartość, tym mniej się zderzy.źródło
Item A
pozycję 123 iItem C
pozycję 124, nie ma łatwego sposobu na umieszczenieItem B
między nimi. Jednym rozwiązaniem byłoby użycie liczb ułamkowych (np. Liczby zmiennoprzecinkowe), ale mają one również ograniczoną precyzję. Czasami lepiej jest zrobić numerację, normalizować interwały i uprościć sprawę.Osobiście zwróciłbym tablicę JSON dla danych z zaplecza. Następnie użyłbym JavaScript (JQuery lub knockout) do wyświetlania i sortowania oraz ponownego sortowania danych. W ten sposób sortowanie nie obciąża serwera.
źródło
Szukasz przyjaznego dla zasobów sposobu na poradzenie sobie z tym, ale przyjazna dla użytkownika perspektywa jest również koniecznością. Polecam indywidualne zamówienia po każdym zamówionym produkcie. Każde połączenie pozwala sprawdzić, czy zostało przyjęte czy nieudane.
Alternatywnie, użycie obiektu JSON (@ tom-squires) jest dobrym pomysłem, aby zmniejszyć obciążenie HTTP i przetwarzanie po stronie serwera, ale ostatecznie wymaga więcej kodu do obsługi żądań po stronie serwera i klienta. Jeśli to jest OK, przekazanie obiektu do serwera jest najbardziej technicznie wydajne. Pozwala to również na kilkuminutowe opóźnienie, aby umożliwić wielokrotne ponowne uporządkowanie przed pojedynczym żądaniem, jeśli tego chcesz.
Należy pamiętać, że aby przekazać użytkownikowi informację zwrotną na temat nieudanych żądań, trzeba przeanalizować obiekt JSON odpowiedzi z serwera, aby dowiedzieć się, który element się nie powiódł i na tej podstawie zresetować interfejs użytkownika.
źródło
Coś takiego w module obsługi zdarzenia drop, gdzie e jest zdarzeniem DnD.
źródło