2011-02-07 23 views
22

Khi tôi sử dụng $('#mygrid').jqGrid('GridUnload'); lưới của tôi bị hủy: không có máy nhắn tin/không có tiêu đề.jqGrid GridUnload/GridDestroy

Trong một wiki tôi thấy:

Sự khác biệt duy nhất phương pháp trước đó là lưới điện bị phá hủy, nhưng các yếu tố bảng và máy nhắn tin (nếu có) còn lại sẵn sàng để được sử dụng một lần nữa.

Tôi không thể tìm thấy bất kỳ sự khác biệt nào giữa GridUnload/GridDestroy hoặc tôi có vấn đề gì không?

Tôi sử dụng jqGrid 3.8.

Trả lời

57

Để có thể tạo jqGrid trên trang, bạn phải chèn phần tử trống <table> vào vị trí của trang nơi bạn muốn xem lưới. Ví dụ đơn giản nhất của phần tử bảng là <table id="mygrid"></table>.

Phần tử trống <table> chính nó sẽ là không thấy trên trang cho đến khi bạn gọi $('#mygrid').jqGrid({...}) và các phần tử lưới như tiêu đề cột sẽ được tạo.

Phương thức GridDestroy hoạt động như jQuery.remove. Nó xóa tất cả các thành phần thuộc về lưới bao gồm phần tử <table>.

Phương pháp GridUnload mặt khác xóa tất cả, nhưng yếu tố trống <table> nằm trên trang. Vì vậy, bạn có thể tạo lưới mới trên cùng một vị trí. Phương pháp GridUnload rất hữu ích nếu bạn cần tạo trên một vị trí lưới khác nhau phụ thuộc vào các điều kiện khác nhau. Hãy xem the old answer với the demo. Bản trình diễn cho thấy hai lưới khác nhau có thể được tạo động trên cùng một vị trí như thế nào. Nếu bạn chỉ thay thế GridUnload trong mã thành GridDestroy bản trình diễn sẽ không hoạt động: sau khi phá hủy lưới đầu tiên, không có lưới khác nào được tạo trên cùng một vị trí.

+0

Một câu hỏi nữa: Có một sự chờ đợi/tạm dừng/thời gian chờ funktion, cho đến khi một php-script đã thực hiện công việc của mình (trong kịch bản của tôi tạo ra một pdf và làm cho một số mysql-truy vấn). .delay (từ jquery) có vẻ không hoạt động. Bất kỳ ý tưởng und VIELEN VIELEN DANK (cho cộng đồng: Oleg nói tiếng Đức ;-) – Scharlotte

+0

Cảm ơn bạn Oleg một lần nữa! Vấn đề của tôi là jqgrid ist nhanh hơn so với php-Skript tôi muốn trì hoãn việc thực hiện các funktion createmygrid() như trong ví dụ của bạn. – Scharlotte

+0

hoàn toàn cảm ơn bạn –

7

Ngoài câu trả lời của Oleg tôi muốn chỉ ra rằng GridUnload làm được nhiều hơn một chút mà chỉ cần loại bỏ lưới từ bảng. Nó loại bỏ phần tử bảng HTML ban đầu (và máy nhắn tin), và quảng cáo một phần tử giống hệt nhau ở vị trí của nó (ít nhất là trong 4.5.4 nó). Điều này có nghĩa là nếu bạn đính kèm một số trình xử lý sự kiện vào phần tử bảng HTML (tức là với jquery, như ('#gridID'). ('Event', 'selector', handler)) chúng cũng sẽ bị xóa . Thông thường, các sự kiện sẽ không kích hoạt trên lưới mới nếu bạn thay thế lưới cũ bằng một lưới mới ...

1

Câu trả lời của Oleg hoạt động tốt với tôi miễn là tôi không có tiêu đề Nhóm.

Khi tôi thêm nhóm hàng tiêu đề với 'setGroupHeaders'

kết quả của một 'GridUnload' theo sau là một $ ('# mygrid'). JqGrid ({...}) không nhất quán.

Nó hoạt động tốt trong Chrome nhưng không hoạt động trong IE11.

Trong IE11, mỗi mục 'jqg-third-row-header' sẽ được hiển thị trên các hàng khác nhau (theo đường chéo).

Tôi đang sử dụng free-jqGrid: query.jqgrid.src.js phiên bản 4.13.4 để gỡ lỗi. tôi bắt nguồn từ vấn đề xuống mã, trong tập tin này, bắt đầu với dòng 9936:

if (o.useColSpanStyle) { 
    // Increase the height of resizing span of visible headers 
    $htable.find("span.ui-jqgrid-resize").each(function() { 
     var $parent = $(this).parent(); 
     if ($parent.is(":visible")) { 
      this.style.cssText = "height:" + $parent.height() + "px !important; cursor:col-resize;"; 
      //this.style.cssText = "height:" + $parent.css('line-height'); + "px !important;cursor:col-resize;"; 
     } 
    }); 
    // Set position of the sortable div (the main lable) 
    // with the column header text to the middle of the cell. 
    // One should not do this for hidden headers. 
    $htable.find(".ui-th-column>div").each(function() { 
     var $ts = $(this), $parent = $ts.parent(); 
     if ($parent.is(":visible") && $parent.is(":has(span.ui-jqgrid-resize)") && !($ts.hasClass("ui-jqgrid-rotate") || $ts.hasClass("ui-jqgrid-rotateOldIE"))) { 
      // !!! it seems be wrong now 
      $ts.css("top", ($parent.height() - $ts.outerHeight(true))/2 + "px"); 
      // $ts.css("top", ($parent.css('line-height') - $ts.css('line-height'))/2 + "px"); 
     } 
    }); 
} 
$(ts).triggerHandler("jqGridAfterSetGroupHeaders"); 
}); 

Mã này đặt chiều cao và giá trị css đầu liên quan đến từng 'jqg phần ba-hàng-tiêu đề' mục. Điều này dẫn đến bố cục cao và chéo của 'jqg-third-row-header'
Lỗi tiềm năng:.

Phương thức $ parent.height() và $ ts.height() ở trên, trả về chiều cao bảng jqGrid cũ trong IE11. Trong Chrome, họ trả về chiều cao tính toán 'thứ' (trên cùng = 0). Tôi đã thêm và kiểm tra 2 dòng nhận xét sử dụng chiều cao dòng. IE11 hoạt động tốt khi sử dụng chiều cao dòng. Tôi không hoàn toàn hiểu được JqGrid thay đổi kích thước logic, vì vậy đây có thể không phải là một sửa chữa.
Giải pháp thay thế:

Nếu bạn chỉ định.

colModel: 
    { 
    label: 'D', 
    name: 'W', 
    width: 6, 
    align: 'center', 
    resizable:false //required for IE11 multiple calls to this init() 
    }, 

Khi thay đổi kích thước sai mã ở trên không gặp phải và chiều cao và trên cùng không được đặt.
jlegrid của Oleg là một điều khiển rất tốt đẹp. Có lẽ anh ta có thể kiểm tra lưới demo của mình với một groupheader trên IE11.