2010-05-28 44 views
57

Tôi muốn người dùng có thể lọc dữ liệu lưới mà không cần sử dụng hộp tìm kiếm nội tại.Cách lọc dữ liệu jqGrid KHÔNG sử dụng hộp tìm kiếm/bộ lọc tích hợp

Tôi đã tạo hai trường nhập cho ngày (từ và đến) và bây giờ cần báo cho lưới để chấp nhận điều này làm bộ lọc của nó và sau đó yêu cầu dữ liệu mới.

Giả mạo yêu cầu máy chủ cho dữ liệu lưới (bỏ qua lưới) và đặt dữ liệu của lưới thành dữ liệu phản hồi sẽ không hoạt động - bởi vì ngay khi người dùng cố gắng sắp xếp lại kết quả hoặc thay đổi trang, v.v. sẽ yêu cầu dữ liệu mới từ máy chủ bằng bộ lọc trống.

Tôi không thể tìm thấy API lưới để đạt được điều này - có ai có bất kỳ ý tưởng nào không? Cảm ơn.

+0

Revisa este quấn chặc (kiểm tra liên kết này) http://stackoverflow.com/questions/17179777/search-with-autocomplete-in-codeigniter-and-jqgrid/17195094#17195094 –

Trả lời

78

Bạn có thể giải quyết vấn đề rất dễ dàng đối với tham số postData bao gồm các chức năng và trigger('reloadGrid'). Tôi cố gắng giải thích ý tưởng chi tiết hơn.

Hãy để chúng tôi sử dụng mtype: "GET". Điều duy nhất mà hộp tìm kiếm/bộ lọc tiêu chuẩn làm sau khi hiển thị giao diện là thêm một số thông số bổ sung vào url, gửi đến máy chủ và tải lại dữ liệu lưới. Nếu bạn có giao diện riêng của mình để tìm kiếm/lọc (ví dụ: một số điều khiển chọn hoặc hộp kiểm chọn), bạn chỉ cần tự thêm url của mình và tải lại lưới đối với trigger('reloadGrid'). Để đặt lại thông tin trong lưới, bạn có thể chọn bất kỳ cách nào bạn muốn. Ví dụ, bạn có thể bao gồm trong các điều khiển chọn mà bạn có một tùy chọn như "không lọc".

Để chính xác hơn mã của bạn nên trông giống như mã từ câu trả lời how to reload jqgrid in asp.net mvc when i change dropdownlist:

var myGrid = jQuery("#list").jqGrid({ 
    url: gridDataUrl, 
    postData: { 
     StateId: function() { return jQuery("#StateId option:selected").val(); }, 
     CityId: function() { return jQuery("#CityId option:selected").val(); }, 
     hospname: function() { return jQuery("#HospitalName").val(); } 
    } 
    // ... 
}); 
// 
var myReload = function() { 
    myGrid.trigger('reloadGrid'); 
}; 
var keyupHandler = function (e,refreshFunction,obj) { 
    var keyCode = e.keyCode || e.which; 
    if (keyCode === 33 /*page up*/|| keyCode === 34 /*page down*/|| 
     keyCode === 35 /*end*/|| keyCode === 36 /*home*/|| 
     keyCode === 38 /*up arrow*/|| keyCode === 40 /*down arrow*/) { 

     if (typeof refreshFunction === "function") { 
      refreshFunction(obj); 
     } 
    } 
}; 

// ... 
$("#StateId").change(myReload).keyup(function (e) { 
    keyupHandler(e,myReload,this); 
}); 
$("#CityId").change(myReload).keyup(function (e) { 
    keyupHandler(e,myReload,this); 
}); 

Nếu người dùng thay đổi tùy chọn trong hộp chọn chọn với id=StateId hoặc một hộp chọn với id=CityId (bằng chuột hoặc bàn phím), chức năng myReload sẽ được gọi, mà chỉ buộc tải lại dữ liệu trong jqGrid. Trong yêu cầu $.ajax tương ứng, mà jqGrid làm cho chúng tôi, giá trị từ thông số postData sẽ được chuyển tiếp đến $.ajax làm thông số data. Nếu một số thuộc tính của data là các hàm, hàm này sẽ được gọi bởi $.ajax. Vì vậy, dữ liệu thực tế từ các hộp được chọn sẽ được tải và tất cả dữ liệu sẽ được nối thêm vào dữ liệu được gửi đến máy chủ. Bạn chỉ cần thực hiện đọc các tham số này trong phần máy chủ của bạn.

Vì vậy, dữ liệu từ tham số postData sẽ được thêm vào url (ký hiệu '?' Và '&' sẽ được thêm tự động và tất cả các ký hiệu đặc biệt như khoảng trắng cũng sẽ được mã hóa như bình thường). Những lợi thế của việc sử dụng postData là:

  1. sử dụng các chức năng bên postData tham số cho phép bạn tải giá trị thực tế từ tất cả các điều khiển sử dụng đến thời điểm nạp lại;
  2. Mã của bạn ở lại có cấu trúc rất rõ ràng.
  3. Tất cả các công trình đều không chỉ với yêu cầu HTTP GET, mà còn với HTTP POST;

Nếu bạn sử dụng một số "không lọc" hoặc "tất cả" các mục trong hộp chọn StateId, bạn có thể thay đổi chức năng mà tính giá trị của StateId tham số mà nên nối vào url máy chủ từ

StateId: function() { return jQuery("#StateId option:selected").val(); } 

một cái gì đó như sau:

StateId: function() { 
    var val = jQuery("#StateId option:selected").val(); 
    return val === "all"? "": val; 
} 

về phía server, bạn nên làm cho không có lọc cho StateId nếu bạn nhận được một giá trị rỗng như một tham số.

Tùy chọn bạn có thể sử dụng myGrid.setCaption('A text'); để thay đổi tiêu đề lưới. Điều này cho phép người dùng thấy rõ hơn, dữ liệu trong lưới được lọc với một số tiêu chí.

+0

@Oleg, tôi có thể ghi đè các hàm 'postData' mặc định bằng' grid.setGridParam'? Tôi đang cố gắng làm điều này, nhưng không thành công. Có vẻ như mặc dù tôi đã đặt một tham số thông qua 'grid.setGridParam' nhưng nó vẫn nhận được hàm mặc định' postData' mà tôi đã định nghĩa trước đó. – AdrianoRR

+0

@AdrianoRR: Có lẽ bạn nên viết một câu hỏi mới, nơi bạn mô tả vấn đề mà bạn muốn giải quyết. Những gì bạn cần? Bạn có muốn một số thông số sẽ không được gửi đến máy chủ không? Bạn có cần định dạng tùy chỉnh các thông số hiện có (như chuyển đổi sang JSON) không? Hoặc có thể bạn không muốn gửi bất kỳ tham số bổ sung nào cho máy chủ? – Oleg

+0

@Oleg, bằng cách xem một số bài đăng khác của bạn, tôi quản lý để có được câu trả lời của riêng tôi. Bằng cách sử dụng 'grid.getGridParam' tôi có thể nhận được các thuộc tính postData và thiết lập chúng mà bất kỳ giá trị nào tôi muốn. Sau đó, tất cả những gì tôi phải làm là gọi 'grid.trigger (" reloadGrid ");' và các thay đổi được thực hiện. Dù sao, cảm ơn vì S.O. bài đăng! – AdrianoRR

2

tôi đã có yêu cầu tương tự, và (với sự giúp đỡ Oleg của) đã đưa ra với điều này:

enter image description here

Về cơ bản, người dùng bắt đầu gõ vào "nhân viên tên" textbox, và ngay lập tức kết quả được thể hiện trong jqGrid.

Chi tiết về làm thế nào tôi thực hiện điều này đang ở đây:

jqGrid - Change filter/search pop up form - to be flat on page - not a dialog

Lưu ý rằng tôi đặc biệt tải tất cả của dữ liệu JSON cho jqGrid tôi trước, và đối với các tập dữ liệu lớn, có là sự chậm trễ khi chạy mã này trên thiết bị iPhone/Android khi bạn nhập từng ký tự.

Nhưng đối với các ứng dụng web dành cho máy tính để bàn, đó là giải pháp tuyệt vời và giúp jqGrid thu hút nhiều người dùng hơn cho người dùng.

0

Bằng cách sử dụng các chức năng ReloadGrid()jquery bạn có thể thực hiện các chức năng lọc tùy chỉnh của riêng mình.

Các vấn đề liên quan