2012-12-13 16 views
11

Có thể lập trình tham số sắp xếp của Nguồn dữ liệu KendoUI trước khi đọc dữ liệu và tránh đọc máy chủ thứ hai không? Phạm vi thiết lập loại mặc định trên tương tác người dùng nhất định. Làm sao?KendoUI: lập trình sắp xếp lưới sắp xếp

Dưới đây là một ví dụ về những gì tôi đang cố gắng làm, bởi vì các câu trả lời không nhận được đến điểm (hoặc có thể tôi không hiểu cách thức hoạt động).

tôi xác định một Kendo DataSource với một loại ban đầu:

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

DataSource này được ràng buộc với một lưới Kendo:

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

Sau đó, tôi có một nút gọi là "đọc" trên DataSource và populates lưới với trang đầu tiên của dữ liệu:

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

bằng cách này, sau khi nhấp vào bu tton, người dùng nhận dữ liệu được sắp xếp theo "field_1" và "field_2" và lưới hiển thị loại này trên tiêu đề cột. Sau đó, người dùng có thể sắp xếp lại dữ liệu theo bất kỳ cách nào bằng cách nhấp vào tiêu đề cột.

Điều tôi muốn làm là đặt lại kiểu mặc định thành sắp xếp ban đầu, như được xác định trong khai báo DataSource, hiển thị lại trên tiêu đề cột và không tạo lại nguồn dữ liệu mới.

Cái gì như:

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

Các giải pháp cung cấp dường như không đạt đến điểm (và tôi vẫn không hiểu tại sao tôi mất điểm danh tiếng cho một câu hỏi chính đáng mà có vẻ là không quá tầm thường và nên được giải quyết bởi khung công tác).

Hãy cho tôi biết tôi sai (Tôi không lo lắng về việc mất uy tín - Tôi chỉ muốn hiểu cách giải quyết vấn đề). Cảm ơn bạn!

+0

Tôi cho rằng điều đó là không thể. –

+0

dường như hoạt động trong JS bằng cách thực hiện $ grid.dataSource.sort ( {field: "A", dir: "desc"}, {trường: "B", dir: "asc"}, {field: "C", dir: "asc"}, {trường: "D", dir: "desc"} ); Vấn đề duy nhất tôi thấy mặc dù là các chỉ số sắp xếp không hiển thị trên tất cả các cột, – topwik

Trả lời

2

Có. Có thể thông qua cài đặt sort.

+1

Không thực sự, sắp xếp gọi một cuộc gọi thứ hai đến máy chủ. Tôi muốn thay đổi sắp xếp trước khi đọc dữ liệu, sửa đổi loại mặc định. –

+0

Sigh ... Bạn có thực sự thử nó? Có lẽ bạn đang sử dụng phương pháp sắp xếp thay vì tùy chọn cấu hình sắp xếp. –

+0

Tôi đã thử cả hai. Bạn có thể cung cấp một ví dụ? Xin vui lòng tham khảo các bình luận tôi để lại câu trả lời khác để hiểu những gì tôi đang cố gắng để làm. –

1

Vì vậy, bạn muốn đặt sắp xếp trước khi đọc dữ liệu lần đầu tiên? Chỉ cần chắc chắn rằng bạn có autobind: false trên điều khiển ui của bạn, sau đó thiết lập các thuộc tính sắp xếp trên nguồn dữ liệu, và sau đó gọi datasource.read() khi bạn đã sẵn sàng để có được dữ liệu được sắp xếp.

+0

Ok, nhưng nếu tôi muốn sắp xếp sau, bên ngoài khai báo nguồn dữ liệu, ngay trước mỗi cuộc gọi đã đọc, vì thay đổi điều kiện sắp xếp hoặc chỉ để đặt lại thành giá trị adefault? Dường như với tôi cách duy nhất để đạt được nó là phá hủy nguồn dữ liệu hiện có, tạo một nguồn dữ liệu mới với tham số sắp xếp mới. –

+0

Bạn có thể làm điều đó. var myDataSource = new kendo.data.DataSource ({}); myDataSource.sort = [{field: "myFieldName", dir: "asc"}, {field: "myOtherField", dir: "desc"}]; Sau đó gọi 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

Tôi nghĩ rằng điều này nên được đánh dấu là câu trả lời. –

+0

có thể cập nhật grid.dataSource.data() phân loại thực tế không? không chỉ xem – agDev

2

Đây là một jsfiddle cho chính xác những gì bạn đang yêu cầu: http://jsfiddle.net/MechStar/c2S5d/

Tóm lại mặc dù, bạn cần phải thiết lập các nguồn dữ liệu null ban đầu, sau đó tiêm các nguồn dữ liệu khi bạn nhận được đầu vào cần thiết từ người dùng:

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

Tôi biết những gì bạn đang cố gắng đạt được. Tôi phải làm như vậy bởi vì chúng tôi đang tiết kiệm phân loại người dùng và lọc (phía máy khách trong trường hợp của tôi) và chúng tôi không thể sử dụng chức năng lưới getOptions/setOptions vì các lý do khác. Thậm chí nếu bạn thiết lập autobind: false đây không phải là đi làm việc như bạn mong đợi, nếu bạn thấy định nghĩa cho autobind:

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

Nếu thiết lập là false widget sẽ không liên kết với dữ liệu nguồn trong khi khởi tạo. Trong trường hợp này, ràng buộc dữ liệu sẽ xảy ra khi sự kiện thay đổi của nguồn dữ liệu được kích hoạt. Theo mặc định, tiện ích con sẽ liên kết với nguồn dữ liệu được chỉ định trong cấu hình.

Khi bạn làm một dataSource.sort (), này bắn một thay đổi sự kiện, sau đó, một đọc được thực hiện trong dataSource ngầm (đó là lý do tại sao bạn có một máy chủ đọc thứ hai).

Vì vậy, những gì bạn phải làm là tạo một nguồn dữ liệu mới với các tùy chọn sắp xếp bắt buộc và sau đó gọi dataSource.read() một cách rõ ràng.

Ví dụ (bạn có thể mở rộng tùy chọn mặc định của bạn để không lặp lại cấu hình):

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

Hope trợ giúp này. Trân trọng!