2012-12-13 14 views
11

Czy jest możliwe programowe ustawienie parametru sortowania źródła danych KendoUI przed odczytaniem danych i uniknięciem odczytu drugiego serwera? Zakres ustawia sortowanie domyślne dla określonej interakcji użytkownika. W jaki sposób?KendoUI: programowo ustawia sortowanie siatki

Oto przykład tego, co próbuję zrobić, ponieważ odpowiedzi nie docierają do rzeczy (a może nie rozumiem, jak działają).

I zdefiniować Kendo DataSource z początkowym rodzaju:

var datasource = new kendo.data.DataSource({ 
    parameterMap: function (inputParams, operation) { 
     return JSON.stringify(inputParams) 
    }, 
    // default sort 
    sort: [ 
     {field: "field_1", dir: "asc"}, 
     {field: "field_2", dir: "asc"} 
    ] 
}); 

Ten DataSource jest związany z siatki Kendo:

var grid = $("element").kendoGrid({ 
    dataSource: datasource 
}); 

Wtedy mam przycisk, który nazywa "czytać" na DataSource i zapełnia siatkę pierwszą stroną danych:

$("#btn").bind("click", function(e) { 
    datasource.page(1); 
}); 

W ten sposób, po kliknięciu przycisku tton, użytkownik otrzymuje dane uporządkowane według "field_1" i "field_2", a siatka pokazuje ten rodzaj w nagłówkach kolumn. Użytkownik może następnie uporządkować dane w dowolny sposób, klikając nagłówek kolumny.

Co chcę zrobić, to zresetować sortowanie domyślne do początkowego, zgodnie z definicją w deklaracji DataSource, wyświetlając ją ponownie w nagłówkach kolumn i bez ponownego tworzenia nowego DataSource.

Coś jak:

$("#btn").bind("click", function(e) { 
    datasource.sort = [ 
     {field: "field_1", dir: "asc"}, 
     {field: "field_2", dir: "asc"} 
    ]; 
    datasource.page(1); 
}); 

rozwiązań przewidzianych nie wydają się dotrzeć do punktu (i nadal nie rozumiem dlaczego tracę punkty reputacji za uzasadnione pytanie, który wydaje się być nie tak banalne i powinny być przedmiotem ram).

Proszę, pokaż mi, że się mylę (nie martwię się o utratę reputacji - chciałbym po prostu zrozumieć, jak rozwiązać problem). Dziękuję Ci!

+0

Przypuszczam, że nie jest to możliwe. –

+0

wydaje się działać w JS, wykonując $ grid.dataSource.sort ( {pole: "A", dir: "desc"}, {pole: "B", dir: "asc"}, {pole: "C", dir: "asc"}, {pole: "D", dir: "opis"} ); Jedynym problemem, jaki widzę, jest to, że wskaźniki sortowania nie pojawiają się we wszystkich kolumnach, – topwik

Odpowiedz

2

Tak. Jest to możliwe poprzez ustawienie sort.

+1

W rzeczywistości sortowanie wywołuje drugie wywołanie na serwerze. Chciałbym zmienić sortowanie przed odczytaniem danych, modyfikując sortowanie domyślne. –

+0

Sigh ... Naprawdę to wypróbowałeś? Być może używasz metody sortowania zamiast opcji konfiguracji sortowania. –

+0

Próbowałem obu. Czy możesz podać przykład? Proszę odnieść się do komentarza, który zostawiłem do drugiej odpowiedzi, aby zrozumieć, co próbuję zrobić. –

1

A więc chcesz ustawić sortowanie przed odczytaniem danych za pierwszym razem? Po prostu upewnij się, że masz autobind: false na kontrolce ui, a następnie ustaw właściwości sortowania w źródle danych, a następnie wywołaj datasource.read(), gdy będziesz gotowy na posortowane dane.

+0

OK, ale jeśli chcę ustawić sortowanie po, poza deklaracją źródła danych, tuż przed każdym odczytaniem połączenia, ponieważ sortować zmianę stanu lub po prostu zresetować do wartości domyślnej? Wydaje mi się, że jedynym sposobem na osiągnięcie tego celu jest zniszczenie istniejącego źródła danych, tworzenie nowego z nowym parametrem sortowania. –

+0

Możesz to zrobić. var myDataSource = new kendo.data.DataSource ({}); myDataSource.sort = [{pole: "mojaFieldName", dir: "asc"}, {field: "myOtherField", dir: "desc"}]; Następnie wywołaj myDataSource.read(); –

28
var kendoGrid = $("#grid").data('kendoGrid'); 
var dsSort = []; 
dsSort.push({ field: "fieldName1", dir: "asc" }); 
dsSort.push({ field: "fieldName2", dir: "desc" }); 
kendoGrid.dataSource.sort(dsSort); 
+2

Myślę, że to powinno być oznaczone jako odpowiedź. –

+0

czy można zaktualizować faktyczne sortowanie grid.dataSource.data()? nie tylko widok – agDev

2

Oto jsfiddle o co dokładnie pytasz: http://jsfiddle.net/MechStar/c2S5d/

w pigułce choć trzeba ustawić DataSource początkowo wartość null, a następnie wstrzyknąć źródła danych, gdy pojawi się potrzebne wejście od użytkownik:

myKendoGrid.data ("kendoGrid"). setDataSource (getKendoDataSource ("ShipName", "asc"));

var getKendoDataSource = function (sidx, sord) { 
    return new kendo.data.DataSource({ 
    type: "odata", 
    transport: { 
     read: "http://demos.kendoui.com/service/Northwind.svc/Orders" 
    }, 
    pageSize: 10, 
    serverPaging: true, 
    serverSorting: true, 
    sort: { 
     field: sidx ? sidx : "", 
     dir: sord ? sord : "" 
    } 
    }); 
}; 
var myKendoGrid = $("#grid").kendoGrid({ 
    columns: [ 
    { field: "OrderID" }, 
    { field: "ShipName" }, 
    { field: "ShipCity" } 
    ], 
    dataSource: null, 
    pageable: { 
    pageSizes: [10, 20, 50, 100, 200] 
    }, 
    resizable: true, 
    scrollable: false, 
    sortable: { 
    allowUnsort: false 
    } 
}); 
$("#link").click(function() { 
    myKendoGrid.data("kendoGrid") 
    .setDataSource(getKendoDataSource("ShipName", "asc")); 
}); 
0

Wiem, co próbujesz osiągnąć. Musiałem zrobić to samo, ponieważ oszczędzamy sortowanie i filtrowanie użytkowników (po stronie klienta w moim przypadku) i nie możemy używać funkcji gridowych getOptions/setOptions z innych powodów. Nawet jeśli ustawisz automatycznego wiązania: fałszywy to nie będzie działać, jak można się spodziewać, jeśli patrz definicja AutoBind:

http://docs.telerik.com/kendo-ui/api/javascript/ui/grid#configuration-autoBind

Jeśli ustawiona na false widżet nie będzie wiązać się z danymi źródło podczas inicjalizacji. W takim przypadku powiązanie danych nastąpi, gdy zostanie wywołane zdarzenie zmiany źródła danych. Domyślnie widget będzie wiązał się ze źródłem danych określonym w konfiguracji.

Po wykonaniu dataSource.sort(), to wystrzeliwuje zmiana wydarzenie Następnie czytać odbywa się w źródle danych w sposób dorozumiany (dlatego masz drugiego czytania serwera).

Co należy zrobić, to utworzyć nowe źródło danych z wymaganymi opcjami sortowania, a następnie jednoznacznie wywołać dataSource.read().

Na przykład (można rozszerzyć opcje domyślne nie powtórzyć konfigurację):

var options = $.extend({}, dataSourceOptions); 
options.sort = [ 
     {field: "field_1", dir: "asc"}, 
     {field: "field_2", dir: "asc"} 
    ]; 
var dataSource = new kendo.data.DataSource(options); 
grid.setDataSource(dataSource); 
grid.dataSource.read(); 

nadzieję, że to pomaga. Pozdrawiam!

Powiązane problemy