2012-06-08 17 views
6

Korzystam z jQuery-autocomplete plugin, aby uzyskać sugestie dotyczące zakończenia wprowadzania łańcucha za pomocą wywołania AJAX na serwerze. Ponadto serwer dba o zwrócenie wyników w takiej kolejności, w jakiej chciałbym, aby były wyświetlane, ale autouzupełnianie pokazuje je w innej kolejności.jQuery Autouzupełnianie kolejność wyników

Jak mogę skonfigurować autouzupełnianie jQuery, aby nie zmieniać kolejności wydruków? Nie wymagam żadnego przetwarzania na końcu klienta, ponieważ dane zostały już uszeregowane/posortowane według potrzeb.

+0

co masz na myśli przez "automatyczne uzupełnianie pokazuje je w innej kolejności"? – Shyju

+0

Mam na myśli, że kolejność łańcuchów wyświetlanych w liście rozwijanej różni się od tej zwróconej przez serwer (co jest ciągiem "\ n" oddzielonej sekwencji znaków, podanej w dokumentacji). – rajatkhanduja

Odpowiedz

8

Cóż, okazało się prostsze niż myślałem. Postanowiłem przeczytać kod wtyczki i zmodyfikować go, komentując kod, który sortuje moje dane wyjściowe.

Wtedy właśnie znalazłem zmienną "sortResults: true" w domyślnych ustawieniach. Tak więc wszystko, czego potrzebowałem, to ustawić tę zmienną na false. Nie znalazłem tego jednak w dokumentacji.

$('#search').autocomplete ({ url: "index.php", sortResults: false })

Teraz wyjście jest w takiej kolejności, że wymagają.

mam ideę czytania kodu do znalezienia/rozwiązać problem stąd: jQuery "Autocomplete" plugin is messing up the order of my data (to nie to samo plugin)

Dzięki. :)

+0

Świetnie! Nie zapomnij przyjąć własnej odpowiedzi :) –

+0

Z pewnością to zrobię, po 48 godzinach. – rajatkhanduja

+0

To bardziej podoba, znacznie łatwiej wyświetlić wstępnie przetworzone wyniki z serwera niż po stronie klienta. +1 – Andreas

18

Po prostu posortuj wyniki serwera przed wysłaniem go do autouzupełniania.

Więc zanim echo json_encode($return_arr); użyć funkcji sort() na $return_arr

Można również spróbować czegoś takiego:

Logika jest zbudować tablicę zapałek że początek terminu, a następnie połącz to z dopasowaniami, które zawierają ten termin, ale nie zaczynaj od niego.

$(document).ready(function() { 
    var source = ['Adam', 'Benjamin', 'Matt', 'Michael', 'Sam', 'Tim']; 
    $("input").autocomplete({ 
     source: function (request, response) { 
      var term = $.ui.autocomplete.escapeRegex(request.term) 
       , startsWithMatcher = new RegExp("^" + term, "i") 
       , startsWith = $.grep(source, function(value) { 
        return startsWithMatcher.test(value.label || value.value || value); 
       }) 
       , containsMatcher = new RegExp(term, "i") 
       , contains = $.grep(source, function (value) { 
        return $.inArray(value, startsWith) < 0 && 
         containsMatcher.test(value.label || value.value || value); 
       }); 

      response(startsWith.concat(contains)); 
     } 
    }); 
}); 

Przykład:http://jsfiddle.net/zkVrs/

Źródło:https://stackoverflow.com/a/8302996/973155

+1

'serwer dba o zwracanie wyników w kolejności, w jakiej chciałbym, aby były wyświetlane, ale autouzupełnianie pokazuje je w innej kolejności. Wygląda na to, że OP już to robi. – Dennis

+0

http://stackoverflow.com/a/8302996/277923 Przeczytałem to z powyższego linku, ale nie jestem w stanie pojąć, jak mogę tego użyć, aby w ogóle "nie sortować".Chciałbym autocomplete jQuery, aby pokazać wynik w kolejności zwróconej przez wywołanie ajax. – rajatkhanduja

+1

Podziel się swoim kodem. –

1

Ponieważ nie ma opcji sortResults w aktualnej wersji wtyczki jQuery Autocomplete, musiałem przeszukać inne rozwiązanie tego problemu i odkryłem, że jedynym powodem, dla którego wtyczka sortuje wynik, jest to, że odpowiedź serwera jest normalizowana za każdym razem, gdy nie jest to czysta tablica z obiektami {label: ..., value: ...}.

Uwzględniając PHP jako język Twojego użycia, json_encode (array_values ​​($ your_array)); powinien załatwić sprawę.

+0

Dzięki @sKopheK! Aby wyjaśnić, podaj to do parametru odpowiedzi funkcji źródła: '[{label:" sugestia ", wartość:" sugestia "},]' - nie to: '[" sugestia ",]' – joeymink

Powiązane problemy