Ponowne ładowanie / odświeżanie siatki Kendo


171

Jak przeładować lub odświeżyć Kendo Grid za pomocą Javascript?

Często wymagane jest ponowne załadowanie lub odświeżenie siatki po pewnym czasie lub po akcji użytkownika.

Odpowiedzi:


314

Możesz użyć

$('#GridName').data('kendoGrid').dataSource.read(); <!--  first reload data source -->

$('#GridName').data('kendoGrid').refresh(); <!--  refresh current UI -->

19
@zespri readzażąda serwera i załaduje tylko ponownie źródło danych. Nie będzie żadnych zmian w interfejsie użytkownika. refreshponownie wyrenderuje elementy w siatce z bieżącego źródła danych. Dlatego oba są wymagane.
Botis

37
Myślę, że nie potrzebujesz odświeżania w najnowszej wersji Kendo. Wydaje się, że bez niego działa dobrze
GraemeMiller

2
Tak! Działa to również z TreeList: $ ('# Gantt'). Data ('kendoTreeList'). DataSource.read (); $ ('# Gantt'). Data ('kendoTreeList'). Refresh ();
Hernaldo Gonzalez

27
Programiści wyraźnie mówią, aby nie wywoływać odświeżania po przeczytaniu: telerik.com/forums/show-progress-spinner-during-load-refresh, ponieważ może to uniemożliwić pojawienie się wskaźnika postępu.
Rustam Miftakhutdinov

2
Używam nowszej wersji i muszę tylko zadzwonić .read. Wywołanie .refresh po odczytaniu powoduje dwie podróże do serwera w celu pobrania danych.
Justin,

59

Nigdy nie odświeżam.

$('#GridName').data('kendoGrid').dataSource.read();

sama pracuje dla mnie cały czas.


31
$('#GridName').data('kendoGrid').dataSource.read();
$('#GridName').data('kendoGrid').refresh();

Dzięki, ale to daje błąd „TypeError: $ (...). Data (...) is undefined”. Przejrzałem też wiele stron i wypróbowałem różne odmiany tego rozwiązania, ale nadal otrzymuję ten sam błąd. Dowolny pomysł?
Jack,

Jeśli data ('kendoGrid') zwróci wartość null, to najprawdopodobniej albo identyfikator jest nieprawidłowy, albo jeszcze nie utworzyłeś siatki. Uwaga: tworzysz siatkę za pomocą $ (..). KendoGrid () i uzyskujesz do niej dostęp później za pomocą $ (). Data ('kendoGrid')
tony

29

W ostatnim projekcie musiałem zaktualizować Kendo UI Grid na podstawie niektórych wywołań, które miały miejsce w niektórych menu rozwijanych. Oto, czego ostatecznie użyłem:

$.ajax({
        url: '/api/....',
        data: { myIDSArray: javascriptArrayOfIDs },
        traditional: true,
        success: function(result) {
            searchResults = result;
        }
    }).done(function() {
        var dataSource = new kendo.data.DataSource({ data: searchResults });
        var grid = $('#myKendoGrid').data("kendoGrid");
        dataSource.read();
        grid.setDataSource(dataSource);
    });

Miejmy nadzieję, że pozwoli to zaoszczędzić trochę czasu.


dokładnie to, czego szukałem grid.setDataSource (dataSource); w przypadku połączeń nie zdalnych jest to to, czego musisz użyć. Dzięki!
Rui Lima,

15

Żadna z tych odpowiedzi nie otrzymuje faktu, że readzwraca obietnicę, co oznacza, że ​​możesz poczekać na załadowanie danych przed wywołaniem odświeżania.

$('#GridId').data('kendoGrid').dataSource.read().then(function() {
    $('#GridId').data('kendoGrid').refresh();
});

Jest to niepotrzebne, jeśli pobieranie danych jest natychmiastowe / synchroniczne, ale jest bardziej niż prawdopodobne, że pochodzi z punktu końcowego, który nie wróci natychmiast.


1
Korzystanie z wbudowanej obsługi obietnic jest naprawdę wygodne i usunęło również kilka linii kodu. Założę się, że to powinna być prawdziwa odpowiedź.
FoxDeploy

1
Dziękuję Zachary! Spędziłem kilka godzin nad tym problemem - Twoje rozwiązanie jako jedyne zadziałało dla mnie. Wstawiam wiersze do mojego źródła bazy danych siatki przez Ajax, zapętlone (jeden wiersz na raz). Po zakończeniu pętli dataSource.read () działała tylko czasami. „wtedy” jest tym, czego potrzebowałem. Bardzo cenione!
Antony D

9

Jeśli nie chcesz mieć odniesienia do siatki w module obsługi, możesz użyć tego kodu:

 $(".k-pager-refresh").trigger('click');

Spowoduje to odświeżenie siatki, jeśli jest przycisk odświeżania. Przycisk można włączyć w następujący sposób:

[MVC GRID DECLARATION].Pageable(p=> p.Refresh(true))

9

Właściwie są różne:

  • $('#GridName').data('kendoGrid').dataSource.read()odświeża uidatrybuty wiersza tabeli

  • $('#GridName').data('kendoGrid').refresh() pozostawia ten sam uid


8

Wystarczy, że dodasz zdarzenie .Events (events => events.Sync ("KendoGridRefresh")) w kodzie powiązania kendoGrid. Nie ma potrzeby pisania kodu odświeżającego w wyniku Ajax.

@(Html.Kendo().Grid<Models.DocumentDetail>().Name("document")
    .DataSource(dataSource => dataSource
    .Ajax()
    .PageSize(20)
    .Model(model => model.Id(m => m.Id))        
    .Events(events => events.Sync("KendoGridRefresh"))    
    )
      .Columns(columns =>
      {
          columns.Bound(c => c.Id).Hidden();              
          columns.Bound(c => c.UserName).Title(@Resources.Resource.lblAddedBy);                           
      }).Events(e => e.DataBound("onRowBound"))
          .ToolBar(toolbar => toolbar.Create().Text(@Resources.Resource.lblNewDocument))
          .Sortable()          
          .HtmlAttributes(new { style = "height:260px" })          
  )

I możesz dodać następującą funkcję Global w dowolnym pliku .js. więc możesz wywołać to dla wszystkich siatek kendo w twoim projekcie, aby odświeżyć kendoGrid.

function KendoGridRefresh() {
    var grid = $('#document').data('kendoGrid');
    grid.dataSource.read();
}

Odśwież kendoGrid, po prostu dodając Event.
Mediolan

8

W moim przypadku za każdym razem miałem niestandardowy adres URL; chociaż schemat wyniku pozostałby ten sam.
Użyłem następujących:

var searchResults = null;
$.ajax({
        url: http://myhost/context/resource,
        dataType: "json",
        success: function (result, textStatus, jqXHR) {
            //massage results and store in searchResults
            searchResults = massageData(result);
        }
    }).done(function() {
        //Kendo grid stuff
        var dataSource = new kendo.data.DataSource({ data: searchResults });
        var grid = $('#doc-list-grid').data('kendoGrid');
        dataSource.read();
        grid.setDataSource(dataSource);
    });

5

Możesz użyć poniższych linii

$('#GridName').data('kendoGrid').dataSource.read();
$('#GridName').data('kendoGrid').refresh();

Aby uzyskać informacje na temat funkcji automatycznego odświeżania, zajrzyj tutaj


5

Używając poniższego kodu, automatycznie wywołała metodę odczytu siatki i ponownie wypełniła siatkę

$('#GridName').data('kendoGrid').dataSource.read();

5

Alternatywnym sposobem ponownego załadowania siatki jest

$("#GridName").getKendoGrid().dataSource.read();

5

Zawsze możesz użyć $('#GridName').data('kendoGrid').dataSource.read();. Naprawdę nie musisz .refresh();tego .dataSource.read();robić, załatwi sprawę.

Teraz, jeśli chcesz odświeżyć swoją siatkę w bardziej kątowy sposób, możesz:

<div kendo-grid="vm.grid" id="grid" options="vm.gridOptions"></div>

vm.grid.dataSource.read();`

LUB

vm.gridOptions.dataSource.read();

I nie zapomnij zadeklarować swoje źródło danych jako kendo.data.DataSourcetyp


5

Użyłem Jquery .ajax do uzyskania danych. Aby ponownie załadować dane do bieżącej siatki, muszę wykonać następujące czynności:

.success (function (result){
    $("#grid").data("kendoGrid").dataSource.data(result.data);
})

4

Chcę wrócić do strony 1, kiedy odświeżę siatkę. Samo wywołanie funkcji read () pozostawi Cię na bieżącej stronie, nawet jeśli nowe wyniki nie mają tylu stron. Wywołanie .page (1) w źródle danych spowoduje odświeżenie źródła danych ORAZ powrót do strony 1, ale zakończy się niepowodzeniem w przypadku siatek, których nie można stronicować. Ta funkcja obsługuje oba:

function refreshGrid(selector) {
     var grid = $(selector);
     if (grid.length === 0)
         return;

     grid = grid.data('kendoGrid');
     if (grid.getOptions().pageable) {
         grid.dataSource.page(1);
     }
     else {
         grid.dataSource.read();
     }
}

4

Aby wykonać pełne odświeżenie, w którym siatka zostanie ponownie wyrenderowana wraz z nowym żądaniem odczytu, możesz wykonać następujące czynności:

 Grid.setOptions({
      property: true/false
    });

Gdzie nieruchomość może być dowolną własnością, np. Sortowalną


3

Po prostu napisz poniższy kod

$('.k-i-refresh').click();

1
Byłoby to prawdą tylko wtedy, gdy zainicjowałeś siatkę z pageable.refresh = true ... co nie jest domyślnie. W każdym razie nie powinieneś używać obejścia UI, gdy możesz to zrobić za pomocą funkcji API (patrz zaakceptowana odpowiedź)
The_Black_Smurf


3

Możesz spróbować:

    $('#GridName').data('kendoGrid').dataSource.read();
$('#GridName').data('kendoGrid').refresh();

3

Jeśli chcesz, aby siatka była automatycznie odświeżana w określonym czasie, możesz użyć następującego przykładu, w którym interwał jest ustawiony na 30 sekund:

   <script type="text/javascript" language="javascript">
      $(document).ready(function () {
         setInterval(function () {
            var grid = $("#GridName").data("kendoGrid");
            grid.dataSource.read();
         }, 30000);
      });
   </script>

2

Domyślna / zaktualizowana konfiguracja / dane widgetów są ustawione tak, aby automatycznie wiązały się z powiązanymi źródłami danych.

$('#GridId').data('kendoGrid').dataSource.read();
$('#GridId').data('kendoGrid').refresh();

Czy było coś nie tak z zaakceptowaną odpowiedzią (od 2013 r.), Ponieważ Twoja odpowiedź wygląda tak podobnie. Powinieneś przynajmniej to skomentować - a komentarze w tej odpowiedzi mówią nawet, że nie powinieneś dzwonićrefresh
James Z

2

Możesz także odświeżyć swoją siatkę, wysyłając nowe parametry do akcji Czytaj i ustawiając strony na to, co lubisz:

var ds = $("#gridName").data("kendoGrid").dataSource;
ds.options.page = 1;
var parameters = {
    id: 1
    name: 'test'
}
ds.read(parameters);

W tym przykładzie akcja read siatki jest wywoływana przez wartość 2 parametrów i po uzyskaniu wyniku stronicowanie siatki jest na stronie 1.


1

Najłatwiejszym sposobem odświeżenia jest użycie funkcji refresh (). Który idzie jak:

$('#gridName').data('kendoGrid').refresh();

podczas gdy możesz również odświeżyć źródło danych za pomocą tego polecenia:

$('#gridName').data('kendoGrid').dataSource.read();

Ten ostatni faktycznie przeładowuje źródło danych siatki. Korzystanie z obu można wykonać w zależności od potrzeb i wymagań.


-2
$("#grd").data("kendoGrid").dataSource.read();

Chociaż nie jest to przynajmniej kopiowanie wklejania 1to1, nie zawiera żadnych dodatkowych informacji. Prawie każda odpowiedź w tym poście z więcej niż jednym głosem za poleceniemdataSource.read()
Fabian
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.