2012-12-13 38 views
11

È possibile impostare a livello di programmazione il parametro sort di un KendoUI DataSource prima di leggere i dati ed evitare una seconda lettura del server? L'ambito sta impostando un ordinamento predefinito su una determinata interazione utente. Come?KendoUI: impostazione della griglia in ordine programmato

Ecco un esempio di ciò che sto cercando di fare, perché le risposte non stanno arrivando al punto (o forse non sto capendo come funzionano le cose).

definisco un Kendo DataSource con un ordinamento iniziale:

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"} 
    ] 
}); 

Questa DataSource è associato a una griglia Kendo:

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

Poi ho un pulsante che chiama una "leggere" sulla DataSource e popola la griglia con la prima pagina di dati:

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

In questo modo, dopo aver fatto clic sul bu tton, l'utente riceve i dati ordinati da "campo_1" e "campo_2", e la griglia mostra questo tipo sulle intestazioni delle colonne. L'utente può quindi riordinare i dati in qualsiasi modo, facendo clic sull'intestazione della colonna.

Quello che vorrei fare è ripristinare l'ordinamento predefinito a quello iniziale, come definito nella dichiarazione DataSource, mostrarlo di nuovo sulle intestazioni di colonna e senza creare nuovamente un nuovo DataSource.

Qualcosa di simile:

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

Le soluzioni fornite non sembrano raggiungere il punto (e ancora non capisco il motivo per cui sto perdendo punti reputazione per una domanda legittima, che sembra non essere così banale e dovrebbe essere affrontato dal quadro).

Per favore, mostrami che ho torto (non mi sto preoccupando di perdere la reputazione - mi piacerebbe solo capire come risolvere un problema). Grazie!

+0

Suppongo che non sia possibile. –

+0

sembra funzionare in JS facendo $ grid.dataSource.sort ( {field: "A", dir: "desc"}, {field: "B", dir: "asc"}, {field: "C", dir: "asc"}, {field: "D", dir: "desc"} ); L'unico problema che vedo è che gli indicatori di ordinamento non vengono visualizzati su tutte le colonne, – topwik

risposta

2

Sì. È possibile tramite l'impostazione sort.

+1

In realtà, l'ordinamento richiama una seconda chiamata al server. Vorrei cambiare l'ordinamento prima di leggere i dati, modificando l'ordinamento predefinito. –

+0

Sigh ... L'hai provato davvero? Forse stai usando il metodo sort invece dell'opzione di configurazione sort. –

+0

Ho provato entrambi. Potresti fornire un esempio? Si prega di fare riferimento al commento che ho lasciato all'altra risposta per capire cosa sto cercando di fare. –

1

Quindi si desidera impostare l'ordinamento prima di leggere i dati la prima volta? Assicurati di avere l'autobind: false sul controllo dell'interfaccia utente, quindi imposta le proprietà di ordinamento sull'origine dati, quindi chiama datasource.read() quando sei pronto per ottenere i dati ordinati.

+0

Ok, ma se voglio impostare sort after, al di fuori della dichiarazione datasource, appena prima di ogni chiamata read, perché il modifica della condizione di ordinamento o solo per ripristinare il valore predefinito? Mi sembra che l'unico modo per ottenerlo sia distruggere l'origine dati esistente, creando una nuova con il nuovo parametro sort. –

+0

Puoi farlo. var myDataSource = new kendo.data.DataSource ({}); myDataSource.sort = [{field: "myFieldName", dir: "asc"}, {field: "myOtherField", dir: "desc"}]; Quindi chiama 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

Penso che questo dovrebbe essere contrassegnato come la risposta. –

+0

è possibile aggiornare l'ordinamento grid.dataSource.data() effettivo? non solo la vista – agDev

2

Ecco un jsfiddle esattamente quello che stai chiedendo: http://jsfiddle.net/MechStar/c2S5d/

In poche parole, però, è necessario impostare il DataSource su null inizialmente, poi iniettare il DataSource quando si ottiene l'input necessario dal utente:

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

So cosa stai cercando di ottenere. Ho dovuto fare lo stesso perché stiamo salvando l'ordinamento e il filtraggio dell'utente (lato client nel mio caso) e non possiamo usare le funzioni di rete getOptions/setOptions per altri motivi. Anche se si imposta bind automatico: true questo non sta andando a lavorare come ci si aspetta, se si vede la definizione per bind automatico:

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

Se impostato su false il widget non si legheranno ai dati fonte durante l'inizializzazione. In questo caso l'associazione dei dati avverrà quando viene attivato l'evento di modifica dell'origine dati. Di default il widget si collegherà all'origine dati specificata nella configurazione.

Quando si esegue un dataSource.sort(), questo spara un cambiamento evento, quindi, un leggere è fatto in DataSource implicitamente (ecco perché si dispone di una seconda lettura del server).

Quindi, ciò che dovete fare è creare una nuova origine dati con le opzioni di ordinamento richieste e quindi chiamare un dataSource.read() in modo esplicito.

Per esempio (è possibile estendere le opzioni di default per non ripetere la configurazione):

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(); 

Spero che questo aiuto. Saluti!

Problemi correlati