2011-01-19 27 views
6

(Xem this questionthis question cho nền ...)SlickGrid onSelectedRowsChuyển đổi hai lần khi có nhiều hàng được chọn?

Given:

grid = new Slick.Grid("#myGrid", data, columns, options); 
grid.setSelectionModel(new Slick.RowSelectionModel()); 
grid.onSelectedRowsChanged.subscribe(function() { 
    row_ids = grid.getSelectedRows(); 
    console.log(row_ids); 
}); 

... khi tôi chọn một dòng (nói, hàng 5), tôi nhận được một sản lượng

[4] 

... đó là những gì tôi mong đợi. Tuy nhiên, CMD + Click hoặc SHIFT + Click -ing hàng khác (ví dụ, hàng 3) ngoài hàng này mang lại cho tôi một đầu ra của

[2] 
[4, 2] 

... đó là những gì tôi KHÔNG mong chờ (Tôi mong chờ chỉ [4, 2]). Điều này dường như xảy ra miễn là số hàng được chọn là > 1. Vì vậy, nếu tôi được tiếp tục chọn một hàng khác (ví dụ, hàng 17), tôi sẽ có được điều này

[16] 
[4, 2, 16] 

tôi đã thêm một breakpoint trên báo cáo kết quả console.log và xác minh rằng onSelectedRowsChanged đang được bắn hai lần: một lần cho hàng mới được nhấp và một lần cho tất cả các hàng đã chọn.

Tại sao điều này? Tôi chỉ muốn nó bắn sau khi, cấp cho tôi toàn bộ các hàng đã chọn. Làm thế nào tôi sẽ thực hiện được điều này? Hay tôi đang thiếu một cái gì đó?

+0

bạn đang sử dụng phiên bản SlickGrid nào? Tôi đang sử dụng một thanh toán khá cập nhật từ chi nhánh "v2 master" (có thể là giữa tháng 1 năm 2011) và không gặp vấn đề này – fbuchinger

+0

Tôi đang sử dụng "SlickGrid v2.0 alpha", trực tiếp từ github trang. Tôi tìm thấy nguồn gốc của sự cố ... đăng bên dưới ... – neezer

+0

Tệ của tôi; đã cập nhật câu hỏi trên (thay vì trả lời dưới đây). – neezer

Trả lời

3

Sự cố (Tôi đã phát hiện ra) nằm trong mẫu lựa chọn hàng Slick.RowSelectionModel().

Cụ thể, khi hàng được chọn, handleActiveCellChange()handleClick() được gọi, mỗi số gọi setSelectedRanges(), trước đó chỉ đặt hàng đó thành hàng hiện đang được nhấp và hàng sau đặt hàng đó thành tất cả các hàng đã chọn.

tôi cố định này bằng cách unregistering trong init() (bên slick.rowSelectionModel.js) _grid.onActiveCellChanged xử lý và chuyển các cuộc gọi bên handleClick():

function init(grid) { 
    _options = $.extend(true, {}, _defaults, options); 
    _grid = grid; 
    // _grid.onActiveCellChanged.subscribe(handleActiveCellChange); 
    _grid.onKeyDown.subscribe(handleKeyDown); 
    _grid.onClick.subscribe(handleClick); 
} 

... 

function handleClick(e, data) { 

    ... 

    if (!e.ctrlKey && !e.shiftKey && !e.metaKey) { 
     handleActiveCellChange(e, data); 
     return false; 
    } 

    ... 

} 

Tôi không biết nếu điều này đã được cố định bởi các tác giả trong "bậc thầy v2", như @fbuchinger đã nói, và tôi biết sửa lỗi này nhanh chóng và dơ bẩn (điều này phá vỡ điều hướng bàn phím và lựa chọn giữa các hàng), nhưng nó hoạt động và mang lại cho tôi hành vi dự kiến ​​được mô tả trong câu hỏi của tôi. Vì tôi quan tâm nhiều hơn đến các nhấp chuột hoạt động chính xác hơn so với điều hướng bàn phím, tôi hiện đang gắn bó với điều này.

Bất kỳ ai biết cách nào tốt hơn?

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