Tải lại / làm mới lưới Kendo


171

Làm cách nào để tải lại hoặc làm mới Lưới Kendo bằng Javascript?

Nó thường được yêu cầu tải lại hoặc làm mới lưới sau một thời gian hoặc sau một hành động của người dùng.

Câu trả lời:


314

Bạn có thể dùng

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

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

19
@zespri readsẽ yêu cầu máy chủ và chỉ tải lại nguồn dữ liệu. Sẽ không có thay đổi trong giao diện người dùng. refreshsẽ kết xuất lại các mục trong lưới từ nguồn dữ liệu hiện tại. Đó là lý do tại sao cả hai đều được yêu cầu.
Botis

37
Tôi không nghĩ bạn cần làm mới trong phiên bản mới nhất của Kendo. Vì nó có vẻ hoạt động tốt mà không có nó
GraemeMiller

2
Vâng! Điều này cũng hoạt động với TreeList: $ ('# Gantt'). Data ('kendoTreeList'). DataSource.read (); $ ('# Gantt'). Data ('kendoTreeList'). Refresh ();
Hernaldo Gonzalez

27
Các nhà phát triển nói rõ ràng không gọi làm mới sau khi đọc: telerik.com/forums/show-proTHER-spinner-during-load-refresh vì nó có thể ngăn chỉ báo tiến trình xuất hiện.
Rustam Miftakhutdinov

2
Tôi đang sử dụng phiên bản mới hơn và tôi chỉ phải gọi .read. Gọi .refresh sau khi đọc gây ra hai chuyến đi đến máy chủ để lấy dữ liệu.
Justin

59

Tôi không bao giờ làm mới.

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

một mình làm việc cho tôi mọi lúc


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

Cảm ơn, nhưng điều này mang lại lỗi "TypeError: $ (...). Dữ liệu (...) không xác định". Tôi cũng đã xem trên nhiều trang và thử các biến thể khác nhau của giải pháp này nhưng vẫn gặp lỗi tương tự. Bất kỳ ý tưởng?
Jack

Nếu dữ liệu ('kendoGrid') trả về null thì rất có thể id đã sai hoặc bạn chưa tạo lưới. NB bạn tạo lưới với $ (..). KendoGrid () và truy cập nó sau với dữ liệu $ (). ('KendoGrid')
tony

29

Trong một dự án gần đây, tôi đã phải cập nhật Lưới UI Kendo dựa trên một số cuộc gọi, điều đó đã xảy ra trên một số lựa chọn thả xuống. Đây là những gì tôi đã kết thúc bằng cách sử dụng:

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

Hy vọng điều này sẽ giúp bạn tiết kiệm thời gian.


chính xác những gì tôi đang tìm kiếm cho Grid.setDataSource (dataSource); đối với các cuộc gọi không phải từ xa, đó là những gì bạn phải sử dụng. Cảm ơn!
Rui Lima

15

Không một câu trả lời nào trong số những câu trả lời này nhận được readmột lời hứa, điều đó có nghĩa là bạn có thể đợi dữ liệu được tải trước khi gọi refresh.

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

Điều này là không cần thiết nếu lấy dữ liệu của bạn là tức thời / đồng bộ, nhưng nhiều khả năng nó đến từ điểm cuối sẽ không quay lại ngay lập tức.


1
Tận dụng hỗ trợ lời hứa tích hợp thực sự tiện lợi và cũng loại bỏ một vài dòng mã. Tôi cá rằng đây sẽ là câu trả lời đúng.
FoxDeploy

1
Cảm ơn bạn Zachary! Tôi đã dành một vài giờ cho vấn đề này - giải pháp của bạn là giải pháp duy nhất phù hợp với tôi. Tôi đang chèn các hàng vào nguồn cơ sở dữ liệu lưới của mình thông qua ajax, được lặp (một hàng tại một thời điểm). Sau khi vòng lặp kết thúc dataSource.read () chỉ hoạt động đôi khi. "Sau đó" là những gì tôi cần. Nhiều đánh giá cao!
Antony D

9

Nếu bạn không muốn có một tham chiếu đến lưới trong trình xử lý, bạn có thể sử dụng mã này:

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

Điều này sẽ làm mới lưới, nếu có nút làm mới. Nút có thể được kích hoạt như vậy:

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

9

Thật ra, chúng khác nhau:

  • $('#GridName').data('kendoGrid').dataSource.read()làm mới các uidthuộc tính của hàng của bảng

  • $('#GridName').data('kendoGrid').refresh() lá uid giống nhau


8

Những gì bạn phải làm chỉ là thêm một sự kiện .Events (event => event.Sync ("KendoGridRefresh")) trong mã ràng buộc kendoGrid của bạn. Không cần phải viết mã làm mới trong kết quả 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" })          
  )

Và bạn có thể thêm chức năng Toàn cầu sau vào bất kỳ tệp .js nào của mình. vì vậy, bạn có thể gọi nó cho tất cả các lưới kendo trong dự án của bạn để làm mới kendoGrid.

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

Làm mới kendoGrid bằng cách thêm Sự kiện.
Milan

8

Trong trường hợp của tôi, tôi đã có một url tùy chỉnh để đi đến mỗi lần; mặc dù lược đồ của kết quả sẽ giữ nguyên.
Tôi đã sử dụng như sau:

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

Bạn có thể sử dụng các dòng dưới đây

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

Để biết tính năng tự động làm mới, hãy xem tại đây


5

Bằng cách sử dụng mã sau, nó tự động gọi phương thức đọc của lưới và điền lại lưới

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

5

Một cách khác để tải lại lưới là

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

5

Bạn luôn có thể sử dụng $('#GridName').data('kendoGrid').dataSource.read();. Bạn không thực sự cần phải .refresh();sau đó, .dataSource.read();sẽ thực hiện các mẹo.

Bây giờ nếu bạn muốn làm mới lưới của mình theo cách góc cạnh hơn, bạn có thể làm:

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

vm.grid.dataSource.read();`

HOẶC LÀ

vm.gridOptions.dataSource.read();

Và đừng quên khai báo nguồn dữ liệu của bạn dưới kendo.data.DataSourcedạng


5

Tôi đã sử dụng Jquery .ajax để lấy dữ liệu. Để tải lại dữ liệu vào lưới hiện tại, tôi cần làm như sau:

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

4

Tôi muốn quay lại trang 1 khi tôi làm mới lưới. Chỉ cần gọi hàm read () sẽ giữ bạn trên trang hiện tại, ngay cả khi kết quả mới không có nhiều trang đó. Gọi .page (1) trên nguồn dữ liệu sẽ làm mới nguồn dữ liệu VÀ quay lại trang 1 nhưng không thành công trên các lưới không thể phân trang được. Hàm này xử lý cả hai:

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

Để làm mới hoàn toàn, trong đó lưới sẽ được kết xuất lại cùng với yêu cầu đọc mới, bạn có thể làm như sau:

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

Trường hợp tài sản có thể là bất kỳ tài sản nào, ví dụ như có thể sắp xếp


3

Chỉ cần viết mã dưới đây

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

1
Điều này sẽ chỉ đúng nếu bạn đã khởi tạo lưới với pagizable.refresh = true ... không theo mặc định. Dù sao, bạn không nên sử dụng một cách giải quyết UI khi bạn có thể làm điều đó bằng cách sử dụng chức năng API (xem câu trả lời được chấp nhận)
The_Black_Smurf


3

Bạn có thể thử:

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

3

Nếu bạn mong muốn lưới được tự động làm mới trên cơ sở thời gian, bạn có thể sử dụng ví dụ sau có khoảng thời gian được đặt là 30 giây:

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

2

Cấu hình / dữ liệu mặc định / cập nhật của các widget được đặt để tự động liên kết với DataSource được liên kết.

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

Có điều gì đó không đúng với câu trả lời được chấp nhận (từ năm 2013), vì câu trả lời của bạn trông rất giống nhau. Ít nhất bạn nên bình luận theo cách nào đó - và những bình luận trong câu trả lời đó thậm chí nói rằng bạn không nên gọirefresh
James Z

2

Bạn cũng có thể làm mới lưới của mình bằng cách gửi các tham số mới tới Đọc hành động và đặt các trang theo những gì bạn thích:

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

Trong ví dụ này, hành động đọc của lưới đang được gọi bởi 2 giá trị tham số và sau khi nhận được kết quả, phân trang của lưới nằm ở trang 1.


1

Cách dễ nhất để làm mới là sử dụng hàm refresh (). Mà đi như:

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

trong khi bạn cũng có thể làm mới nguồn dữ liệu bằng lệnh này:

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

Cái sau thực sự tải lại nguồn dữ liệu của lưới. Việc sử dụng cả hai có thể được thực hiện theo nhu cầu và yêu cầu của bạn.


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

Mặc dù đây ít nhất là không có bản sao chép 1to1, nhưng nó không cung cấp thêm thông tin. Hầu như mọi câu trả lời trong bài đăng này với nhiều hơn một upvote được khuyến nghị sử dụngdataSource.read()
Fabian N.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.