Перезагрузка / обновление Kendo Grid


171

Как перезагрузить или обновить Kendo Grid, используя Javascript?

Часто требуется перезагрузить или обновить сетку через некоторое время или после действия пользователя.

Ответы:


314

Ты можешь использовать

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

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

19
@zespri readзапросит сервер и перезагрузит только перезагрузку источника данных. Там не будет никаких изменений в пользовательском интерфейсе. refreshбудет повторно визуализировать элементы в сетке из текущего источника данных. Вот почему оба требуются.
Botis

37
Я не думаю, что вам нужно обновить в последней версии Кендо. Как кажется, без него нормально работает
GraemeMiller

2
Да! Эта работа также с TreeList: $ ('# Gantt'). Data ('kendoTreeList'). DataSource.read (); $ ( '# Ганта') данные ( 'kendoTreeList') обновления ()..;
Эрнальдо Гонсалес

27
Разработчики прямо говорят, что не следует вызывать обновление после прочтения: telerik.com/forums/show-progress-spinner-during-load-refresh, поскольку это может помешать появлению индикатора прогресса.
Рустам Мифтахутдинов

2
Я использую более новую версию, и мне нужно только позвонить .read. Вызов .refresh после чтения вызывает две поездки на сервер для данных.
Джастин

59

Я никогда не освежаю.

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

один работает на меня все время.


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

Спасибо, но это выдает ошибку «TypeError: $ (...). Data (...) не определена». Я также посмотрел на многих страницах и попробовал различные варианты этого решения, но все равно получаю ту же ошибку. Любая идея?
Джек

Если data ('kendoGrid') возвращает null, то, скорее всего, либо ID неверен, либо вы еще не создали сетку. Обратите внимание, что вы делаете сетку с помощью $ (..). KendoGrid () и обращаетесь к ней позже с помощью $ (). Data ('kendoGrid')
Тони

29

В недавнем проекте мне приходилось обновлять сетку интерфейса пользователя Kendo на основе некоторых вызовов, которые происходили при некоторых выпадающих списках. Вот что я в итоге использовал:

$.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);
    });

Надеюсь, это сэкономит вам время.


именно то, что я искал grid.setDataSource (dataSource); для не удаленных вызовов это то, что вы должны использовать. Спасибо!
Руи Лима

15

Ни один из этих ответов не дает факта, который readвозвращает обещание, что означает, что вы можете подождать загрузки данных, прежде чем вызывать обновление.

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

В этом нет необходимости, если захват данных происходит мгновенно / синхронно, но, скорее всего, он поступает с конечной точки, которая не вернется немедленно.


1
Использование встроенной поддержки обещаний действительно удобно и убрало несколько строк кода. Держу пари, что это будет верный ответ.
FoxDeploy

1
Спасибо, Захария! Я потратил пару часов на эту проблему - ваше решение - единственное, которое сработало для меня. Я вставляю строки в мой источник базы данных сетки через зацикленный цикл (по одной строке за раз). После окончания цикла dataSource.read () работал только иногда. «тогда» это то, что мне было нужно. Очень признателен!
Антоний Д

9

Если вы не хотите иметь ссылку на сетку в обработчике, вы можете использовать этот код:

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

Это обновит сетку, если есть кнопка обновления. Кнопка может быть включена следующим образом:

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

9

На самом деле они разные:

  • $('#GridName').data('kendoGrid').dataSource.read()обновляет uidатрибуты строки таблицы

  • $('#GridName').data('kendoGrid').refresh() оставляет тот же UID


8

Что вам нужно сделать, это просто добавить событие .Events (events => events.Sync ("KendoGridRefresh")) в свой код привязки kendoGrid. Нет необходимости писать код обновления в результате 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" })          
  )

И вы можете добавить следующую Глобальную функцию в любой ваш файл .js. Таким образом, вы можете вызвать его для всех сеток кендо в вашем проекте, чтобы обновить kendoGrid.

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

Обновите kendoGrid, просто добавив событие.
Милан

8

В моем случае у меня был собственный URL-адрес, на который нужно переходить каждый раз; хотя схема результата останется прежней.
Я использовал следующее:

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

Вы можете использовать следующие строки

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

Для функции автоматического обновления посмотрите здесь


5

Используя следующий код, он автоматически вызывает метод чтения сетки и снова заполняет сетку.

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

5

Альтернативный способ перезагрузить сетку

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

5

Вы всегда можете использовать $('#GridName').data('kendoGrid').dataSource.read();. Тебе не нужно .refresh();после этого .dataSource.read();делать свое дело.

Теперь, если вы хотите обновить свою сетку более угловатым способом, вы можете сделать:

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

vm.grid.dataSource.read();`

ИЛИ

vm.gridOptions.dataSource.read();

И не забудьте объявить ваш источник данных как kendo.data.DataSourceтип


5

Я использовал Jquery .ajax для получения данных. Чтобы перезагрузить данные в текущую сетку, мне нужно сделать следующее:

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

4

Я хочу вернуться на страницу 1, когда обновлю сетку. Просто вызов функции read () сохранит вас на текущей странице, даже если в новых результатах не так много страниц. Вызов .page (1) в источнике данных обновит источник данных И вернется на страницу 1, но завершится неудачно в сетках, которые не являются доступными для страниц. Эта функция обрабатывает оба:

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

Чтобы выполнить полное обновление, где сетка будет перерисована вместе с новым запросом на чтение, вы можете сделать следующее:

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

Где собственность может быть любой собственностью, например, сортируемой


3

Просто напишите ниже код

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

1
Это будет верно только в том случае, если вы инициализировали сетку с pageable.refresh = true ..., который не по умолчанию. В любом случае, вы не должны использовать обходной путь пользовательского интерфейса, когда вы можете сделать это с помощью функции API (см. Принятый ответ)
The_Black_Smurf



3

Если вы хотите, чтобы сетка автоматически обновлялась по времени, вы можете использовать следующий пример с интервалом 30 секунд:

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

2

По умолчанию / обновленная конфигурация / данные виджетов настроены на автоматическую привязку к связанному источнику данных.

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

Было ли что-то не так с принятым ответом (с 2013 года), поскольку ваш ответ выглядит так похоже. Вы должны хотя бы прокомментировать это каким-то образом - а комментарии в этом ответе даже говорят, что вам не следует звонитьrefresh
Джеймс З

2

Вы также можете обновить свою сетку, отправив новые параметры в действие «Чтение» и установив нужные страницы:

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

В этом примере действие чтения сетки вызывается значением 2 параметров, и после получения результата разбиение сетки происходит на странице 1.


1

Самый простой выход для обновления - использовать функцию refresh (). Который идет как:

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

в то время как вы также можете обновить источник данных с помощью этой команды:

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

Последний фактически перезагружает источник данных сетки. Использование обоих может быть сделано в соответствии с вашими потребностями и требованиями.


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

Хотя это, по крайней мере, не копирование 1to1, оно не предоставляет никакой дополнительной информации. Почти каждый ответ в этом посте с более чем одним голосом рекомендуется использоватьdataSource.read()
Фабиан Н.
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.