View Single Post
  #2  
Old 06-09-2011, 19:59
ncom ncom vẫn chưa có mặt trong diễn đàn
Mới Đăng Ký
 
Tham gia ngày: Jul 2011
Bài gởi: 8
Thanks: 0
Thanked 8 Times in 3 Posts
Mục đích của việc subclass một component nào đó là để dùng lại component đó mãi về sau trong cùng project hoặc project khác. Với yêu cầu đổ dữ liệu qua lại phía trên, nếu không liên quan đến việc dùng lại thì không cần subclass ComboBox, chỉ cần duy nhất một hàm changeHandler xử lý sự kiện change chung cho cả 2 component là đủ, trong đó bắt lấy cái currentTarget để xem cái nào vừa change rồi thay đổi giá trị tương ứng cho cái kia.

Ví dụ trong link trên subclass ComboBox vì họ muốn dùng lại ComboBox này về sau. Khi đó, ComboBox đóng vai trò chính trong việc xử lý, DataGrid chỉ đóng vai trò phụ và tác dụng duy nhất của DataGrid nằm ở cái binding khi tạo instance cho ComboBox:

selectedValue="{dgAddresses.selectedItem.State}"

Dòng binding này chính là lối vào. Quy trình được giải thích như sau:

1. Mỗi khi chọn một dòng khác trên DataGrid, giá trị selectedItem của DataGrid thay đổi

2. selectedItem của DataGrid thay đổi khiến selectedItem.State thay đổi

3. Kéo theo thuộc tính selectedValue (thuộc tính tự đặt, không phải thuộc tính gốc) của ComboBox thay đổi (vì hai cái binding với nhau, source thay đổi khiến destination thay đổi theo).

4. Có được selectedValue mới, chuyện gì sẽ xảy ra? Sẽ không có chuyện gì xảy ra cho đến khi có sự kiện gì đó khiến ComboBox hiểu rằng vừa có sự thay đổi và nó phải refresh lại bằng cách thực thi hàm commitProperties(). Để chủ động thông báo cho nó đã có sự thay đổi xảy ra và hãy refresh lại ngay lập tức, developer phải tự gọi hàm invalidateProperties().

Khi đó, ComboBox sẽ không đợi nữa mà sẽ lập tức thực thi hàm commitProperties(), trong hàm đó tác giả đã override để thêm vào một vòng lặp duyệt qua các dòng trên dataProvider của ComboBox để tìm ra dòng có ô dữ liệu trùng với giá trị chứa trong selectedValue (ô này nằm trên cột tên là "data", chuỗi "data" này mặc định chứa trong biến tự đặt dataProperty, có thể thay bằng tên cột khác khi khởi tạo ComboBox; dataProperty cũng là thuộc tính tự đặt).

Đơn giản như vậy thôi. Còn cái collectionChangeHandler() chỉ là trường hợp phụ tác giả thêm vào để hoàn thiện hơn. Nó kiểm tra lại trong trường hợp dataProvider của ComboBox được thêm, sửa, xóa một dòng nào đó thì ComboBox cũng sẽ phải làm tương tự như khi selectedValue thay đổi.

Tóm lại, Flex luôn theo phong cách này: Hoặc là đợi một sự kiện xảy ra, sự kiện sẽ bật trigger gọi một hàm nào đó; còn nếu muốn gọi ngay hàm xử lý thì sẽ phải tự gọi một hàm thông báo để thay thế event bật trigger, trong trường hợp này là hàm invalidateProperties(). Khi subclass một component, hai hàm invalidateProperties() và commitProperties() thường xuyên được dùng cùng nhau.
Trả Lời Với Trích Dẫn