2012-03-03 40 views
5

Tôi có một ext js lưới như dưới đây:EXT js có một cột các nút radio

var grid = new Ext.grid.GridPanel({ 
columns: [ 
{header: 'Account Id',dataIndex:'accountId' }, 
{header: 'Account NUmber',dataIndex:'accountNumber' } 
] 
}) 

Bây giờ tôi cần phải chứng minh Id tài khoản cột như một cột các nút radio. Vì vậy, từ người dùng lưới có thể chọn một Id tài khoản và gửi. Khi người dùng tải lại trang, id tài khoản đó sẽ được chọn trước.

Tôi cần một số trợ giúp về cách tiếp tục điều này. Tôi có cần phải viết trình kết xuất trên cột Id tài khoản không? Hoặc là có một cách dễ dàng hơn.

EDIT: Tôi đã làm như thế này:

{header: 'Account Id',dataIndex:'accountId',renderer: function(value) { 
return "<input type='radio' name = 'primaryRadio' " + (value ? "checked='checked'" : "") + ">"; 
}}, 

cú pháp để thêm một sự kiện onclick hoặc onchange sự kiện vào nhóm đài phát thanh là gì?

+1

Bạn có thể gửi nó như một câu trả lời để tôi có thể chấp nhận :) – Victor

+0

tôi chỉ làm?. Cảm ơn! –

Trả lời

3

Bạn đã làm tốt việc hiển thị cột Id tài khoản dưới dạng cột của nút radio, bằng cách sử dụng hàm kết xuất đồ họa.

Về sự kiện onclick cho này, bạn có thể chỉ cần thêm thuộc tính onclick trong thẻ HTML:

return "<input onclick='my_function()' type='radio' name = 'primaryRadio' " + (value ? "checked='checked'" : "") + ">"; 
8

Xây dựng ra câu trả lời trước đó, vâng, tôi nghĩ rằng sử dụng một renderer cho cột của bạn là giải pháp đúng . Tôi nghĩ rằng bạn nên đi về sự kiện nhấp chuột khác với J. Bruni đề xuất mặc dù. Tôi muốn giới thiệu một người nghe nhấp chuột trên bảng điều khiển lưới của bạn để kiểm tra xem bạn có nhấp vào nút radio hay không và ủy quyền cho một phương thức trong GridPanel của bạn.

Something như thế này:

MyRadioGrid = Ext.extend(Ext.grid.GridPanel, { 
    columns: [ 
     {header: 'Account Id',dataIndex:'accountId', renderer: function(value) { 
      return "<input type='radio' name = 'primaryRadio' " + (value ? "checked='checked'" : "") + ">"; 
     }}, 
     {header: 'Account NUmber',dataIndex:'accountNumber' } 
    ], 

    afterRender: function() { 
     MyRadioGrid.superclass.afterRender.apply(this, arguments); 
     this.el.on('click', this.checkRadioClick, this); 
    }, 

    checkRadioClick: function(event) { 
     if (event.getTarget('input[type="radio"]')) { 
      //radio clicked... do something 
     } 
    } 
}); 
+0

+1 Điều này tốt hơn là đặt 'onclick' trong mọi phần tử. Nó chỉ có vẻ hơi dài dòng ... Chúng ta có cách ngắn hơn/sạch hơn để đính kèm trình xử lý sự kiện không? Một cái gì đó giống như của jQuery '$ ('# lưới'). On ('click', 'input [type =" radio "]', gọi lại);' hoặc '$ ('input.account_id'). Click (callback);' (giả sử chúng ta đã thêm một lớp 'account_id' vào đầu vào) ... –

+0

Vâng, jQuery thực hiện rất nhiều với mã nhỏ :). Trong ví dụ này, mặc dù, và nói chung với Ext, tốt nhất là bọc các thành phần nghiệp vụ của bạn làm các lớp mở rộng thành phần Ext, là phần lớn của mã mà tôi đã viết ở trên. Phiên bản ngắn hơn, mà không cần tạo một lớp học toàn bộ, sẽ chỉ là một cái gì đó như 'myGrid.el.on ('click', functionToCheckForRadio)', và sau đó bạn vẫn sẽ cần logic 'event.getTarget'. Tôi không biết bất kỳ cách nào ngắn hơn trong Ext của các sự kiện lọc dựa trên mục tiêu được nhấp, mặc dù điều đó nghe có vẻ giống như một phần mở rộng tốt đẹp! –