Dzisiaj w pracy aktualizowałem DataTables do wersji 1.10, która wprowadziła parę breaking changes (starając się przy tym, być cały czas kompatybilna z poprzednią wersją).

Wszystko by było fajnie gdyby requesty które wykonuje do serwera brały pod uwagę zmiany w API.

Prosty przykład, request który wysyłała moja aplikacja wyglądał tak:

sEcho:1
iColumns:5
sColumns:,,,,
iDisplayStart:0
iDisplayLength:10
mDataProp_0:email
sSearch_0:
bRegex_0:false
bSearchable_0:true
bSortable_0:true
mDataProp_1:firstName
sSearch_1:
bRegex_1:false
bSearchable_1:true
bSortable_1:true
mDataProp_2:lastName
sSearch_2:
bRegex_2:false
bSearchable_2:true
bSortable_2:true
mDataProp_3:organisationName
sSearch_3:
bRegex_3:false
bSearchable_3:true
bSortable_3:true
mDataProp_4:userId
sSearch_4:
bRegex_4:false
bSearchable_4:false
bSortable_4:false
sSearch:
bRegex:false
iSortCol_0:0
sSortDir_0:asc
iSortingCols:1

Co jest poprawne ze starą wersją DT, w nowej powinien on wyglądać tak:

draw:1
columns[0][data]:email
columns[0][name]:
columns[0][searchable]:true
columns[0][orderable]:true
columns[0][search][value]:
columns[0][search][regex]:false
columns[1][data]:firstName
columns[1][name]:
columns[1][searchable]:true
columns[1][orderable]:true
columns[1][search][value]:
columns[1][search][regex]:false
columns[2][data]:lastName
columns[2][name]:
columns[2][searchable]:true
columns[2][orderable]:true
columns[2][search][value]:
columns[2][search][regex]:false
columns[3][data]:organisationName
columns[3][name]:
columns[3][searchable]:true
columns[3][orderable]:true
columns[3][search][value]:
columns[3][search][regex]:false
columns[4][data]:userId
columns[4][name]:
columns[4][searchable]:false
columns[4][orderable]:false
columns[4][search][value]:
columns[4][search][regex]:false
order[0][column]:0
order[0][dir]:asc
start:0
length:10
search[value]:
search[regex]:false

Po dłuższym czytaniu znalazłem informację o tym, jak zmienić to by wykonał on request w wersji 1.10 – okazało się, że trzeba ustawić wartość ext.legacy.ajax na false:

$.fn.dataTable.ext.legacy.ajax = false;

Ale to mi nie dało spokoju, dlaczego nowa wersja 1.10 wykonuje mi domyślnie zapytanie w starej wersji?

Rozwiązanie przyszło wraz z przeczytaniem informacji o tym jak zaktualizować istniejący kod pod nową wersję biblioteki. Okazuje się, że wartość ext.legacy.ajax jest ustawiona domyślnie na null, co powoduje, że DT sam decyduje o tym jak wykonać zapytanie. Ale oczywiście nigdzie nie ma informacji na podstawie czego decyduje.

Rozwiązanie okazało się proste, jeżeli wykorzystanie starą nazwę własności do określenia URLa ajaxowego (sAjaxSource), zapytanie będzie wykonane starym sposobem. Jeżeli wykorzystacie nową nazwę (ajax), zapytanie będzie wykonane nowym sposobem.

Ogólnie na takiej drobnostce, mogę powiedzieć, że zmarnowałem 2h :)

Mam nadzieję, że komuś się może ten post przydać :)