Trang chủ > Uncategorized > Linh tinh về datagrid

Linh tinh về datagrid

Table, datagrid (không biết từ này có trong từ điển không, tránh nhầm với data grid), bảng dữ liệu, v.v là thứ không thể tránh khỏi khi làm mấy thứ hệ thống thông tin😦. Trên thị trường hiện nay có rất nhiều loại datagrid cho web. Hàng bán cả nghìn USD cũng có, hàng trôi nổi cũng không thiếu, mẫu mã đẹp, chức năng đa dạng, nhưng đã dùng là phải hối hận. Chúng ta sẽ xem xét một vài tiêu chí để chọn hoặc xây dựng datagrid.

Nhưng mà trước khi bắt đầu có lẽ tôi phải nói điều này. Nếu bạn định dùng DataGrid của Dojo, hay đang cố gắng chỉnh sửa nói, hay đang cố gắng khắc phục lỗi của nó, thì bạn nên cân nhắc việc bỏ hẳn nó để dùng một thứ khác, có thể là HTML table, có thể là bạn tự viết, SlickGrid, jqGrid, v.v. Nói rộng hơn, nếu bạn đang định dùng hay mới dùng Dojo thì hãy cố gắng tránh xa nó ra trước khi quá muộn.

Quay lại bài.

Quan hệ giữa dữ liệu và việc hiển thị

Các datagrid nói chung thường hay cố gắng quá mức trong việc quản lí data, như xây dựng các Store hay Model để lấy dữ liệu từ server, phân trang, tìm kiếm, cập nhật động, v.v mà trong khi đó xem nhẹ các method để giao tiếp trực tiếp với việc hiển thị. Hệ quả là việc tổ chức dữ liệu cho datagrid sẽ bị couple một cách cứng nhắc, gây khó khăn trong việc tùy chỉnh datagrid hay chuyển đổi sang một loại datagrid mới. Ở mức tối thiểu, datagrid phải cho chúng ta thực hiện những hành động như:

  • thay đổi giá trị được hiển thị (chứ không phải giá trị của dữ liệu) trong một ô
  • render lại một ô, một dòng, hay một khu vực nào đó (chứ không phải cập nhật dữ liệu của datagrid)
  • thay đổi thứ tự các dòng (chứ không phải sắp xếp bản thân dữ liệu của datagrid)
  • v.v

Trong trường hợp tự viết datagrid, tôi nghĩ chúng ta sẽ có ba thành phần:

  • Thành phần hiển thị, đây chính là datagrid. Thành phần này chỉ yêu cầu dữ liệu với cấu trúc tối thiểu, không cần hiểu những chức năng như sắp xếp, tìm kiếm, v.v. Đối với nó, dữ liệu chỉ là để  hiển thị.
  • Thành phần quản lí dữ liệu, như Store hay Model tùy theo framework hay cách bạn viết. Thành phần này ngược lại, không cần biết và không nên biết rằng dữ liệu sẽ được hiển thị với datagrid hay bất kì cái gì.
  • Một datagrid builder để xây dựng cầu nối giữa hai thành phần trên.

Không may là nhiều datagrid có sẵn lại được cung cấp ở dạng datagrid builder, với hai thành phần đầu tiên trộn lẫn rất chặt với nhau.

Markup được sinh ra

Tùy vào mức độ phức tạp của bảng dữ liệu, datagrid có thể dùng thẻ table của HTML, hay dùng thẻ table cho mỗi một dòng, hoặc dùng div và CSS để xếp thành bảng. Riêng table có một ưu điểm là cấu trúc bảng sẽ luôn được bảo đảm bởi ngữ nghĩa của markup, sẽ không bao giờ có chuyện ô trên rộng, ô dưới hẹp, mất ô, v.v. Nói chung, mỗi kiểu có ưu nhược điểm khác nhau, tuy nhiên tốt hơn cả là việc render có thể thay đổi được, dựa vào chẳng hạn những hàm callback. Datagrid sẽ không cần biết dữ liệu được hiển ở dạng bảng hay dạng gì, chúng chỉ cần biết là phải render ô, một nhóm các ô (ví dụ gọi là dòng), và một nhóm các dòng (ví dụ gọi là trang), v.v. Khi đó với dạng đơn giản chúng ta có thể render bảng dùng thẻ table, với dạng phức tạp chúng ta dùng div, v.v. Nếu không thì ít nhất việc thay đổi style như chiều rộng, chiều cao có thể được thực hiện dễ dàng bởi một người chỉ biết CSS. Đồng thời chiều cao của datagrid không được phụ thuộc nhiều vào sự tính toán của JavaScript (như DataGrid của Dojo), mà phải phụ thuộc vào việc reflow của trình duyệt.

Cơ chế plugin

Datagrid nào cũng cho bạn tự viết các hàm callback để tạo giá trị hiển thị trong một ô, hay tạo các thành phần giao diện để người dùng có thể nhập dữ liệu. Tuy nhiên, một datagrid tốt thì nên để cho người dùng có thể tùy ý thay đổi markup. Lí do là việc hiển thị dữ liệu hay thay đổi theo yêu cầu của phần mềm, như tô màu, ẩn, nhập ô, v.v và đều khó đoán trước. Trong khi đó datagrid là một thành phần giao diện phức tạp và việc đọc hiểu cũng như sửa đổi từ bên trong sẽ đòi hỏi nhiều thời gian và công sức. Tốt nhất là datagrid nên cung cấp những hàm callback với tham số là bản thân DOM node của các thành phần trên datagrid. Các callback này có thể được thể hiện như những filter method nhằm cho phép các module khác nhau có thể chỉnh sửa cùng một bộ phận trong markup.

  1. Chưa có phản hồi.
  1. No trackbacks yet.

Gửi phản hồi

Mời bạn điền thông tin vào ô dưới đây hoặc kích vào một biểu tượng để đăng nhập:

WordPress.com Logo

Bạn đang bình luận bằng tài khoản WordPress.com Log Out / Thay đổi )

Twitter picture

Bạn đang bình luận bằng tài khoản Twitter Log Out / Thay đổi )

Facebook photo

Bạn đang bình luận bằng tài khoản Facebook Log Out / Thay đổi )

Google+ photo

Bạn đang bình luận bằng tài khoản Google+ Log Out / Thay đổi )

Connecting to %s

%d bloggers like this: