2012-05-30 31 views
5

Tôi có một bảng có một hàng. Hàng có một TD (với một hộp kiểm trong nó) và trên TD tôi có một chức năng bấm. Vì vậy, khi TD được nhấp vào hộp kiểm sẽ được kiểm tra/bỏ chọn.hộp kiểm knockoutjs và nhấp vào phụ huynh td

Nó hoạt động tốt khi tôi bấm vào TD, nhưng khi nhấp vào hộp kiểm bên các (hình ảnh) giá trị của checkbox không thay đổi (Nó không nhận được checked/unchecked)

Tình hình truy nã là:

  1. Khi tôi nhấp vào hộp kiểm, các (hình ảnh) giá trị của những thay đổi hộp kiểm và tôi có thể gọi một hàm. (ví dụ để thực hiện cuộc gọi AJAX)

  2. Khi tôi bấm vào TD, các (hình ảnh) giá trị của các thay đổi của hộp kiểm và tôi có thể gọi chức năng. (ví dụ để thực hiện cuộc gọi AJAX)

Làm thế nào chúng ta có thể đạt được điều này?

Sample Code

Trả lời

1

Để tránh các vấn đề sự kiện nhấp chuột, sử dụng các yếu tố label để tạo ra một khu vực có thể click lớn hơn. Ở đây tôi đã thực hiện các nhãn một yếu tố khối để nó chiếm toàn bộ td:

<td> 
    <label style="display: block"> 
     <input type="checkbox" data-bind="checked: checkBox" /> 
    </label> 
</td> 

Xem http://jsfiddle.net/mbest/LsxSh/

+0

Cảm ơn !! Điều này làm các trick. Tôi đã chỉnh sửa một chút bằng cách thêm chức năng nhấp chuột. [http://jsfiddle.net/LsxSh/4/](http://jsfiddle.net/LsxSh/4/) – Blottt

0

cách nhấn vào hộp kiểm gọi mã hander nhấp chuột cho td:

self.checkBox(!self.checkBox()); 

này loại bỏ việc kiểm tra.

+0

Đúng, bây giờ câu hỏi là làm sao chúng ta có thể tránh điều này. Tôi chỉ định chính xác những gì tôi đang tìm kiếm trong bài đăng đầu tiên. – Blottt

+0

bạn đã thay đổi câu hỏi :-) –

+0

Yeah: P ... Nó không được hình thành đúng cách. – Blottt

1

Td tổ chức sự kiện dường như được trọng sự kiện kiểm tra bấm các của đầu vào

10

Vấn đề là xử lý nhấp chuột cho TD cháy cũng có khi bạn nhấp vào checkbox, có nghĩa là checkbox bị thay đổi bởi cả xử lý mặc định nhấp chuột cho số checkbox và trình xử lý nhấp tùy chỉnh của bạn cho số TD (chúng chống lại nhau). Giải pháp là để ngăn chặn các nhấp chuột trên checkbox từ sủi bọt đến TD. Bạn có thể làm điều này trong Knockout với ràng buộc này: click:function(){return true}, clickBubble:false.

Đây là nó trong hành động: http://jsfiddle.net/mbest/Eatdh/12/

Tôi nghĩ, tuy nhiên, sử dụng một label là một cách tiếp cận tốt hơn (xem câu trả lời khác của tôi).

+0

Tôi thích điều này vì nó ngăn chặn sự lộn xộn HTML bổ sung. – Tyrsius

+1

'label' có thể là cách tiếp cận tốt hơn cho kịch bản trong câu hỏi, nhưng đây chính là giải pháp tôi cần vì trình xử lý nhấp chuột của tôi trên toàn bộ' tr'. –

0

Đây không phải là khá khô, nhưng nhanh chóng và chức năng của nó: fiddle

<td data-bind="click:tdClick"> 
     <input type="checkbox" data-bind="checked: checkBox, click:tdClick" /> 
</td> 
+2

Đây là phương pháp thay thế cũng hoạt động: Thay đổi dữ liệu liên kết trên hộp kiểm thành 'checked: checkBox, click: function() {return true;}, clickBubble: false'. Trong hộp kiểm của bạn, hộp kiểm được đánh dấu rồi bỏ chọn và sau đó kiểm tra lại khi bạn nhấp vào hộp kiểm đó. –

+0

@MichaelBest Tôi nghĩ đó là giải pháp tốt nhất cho đến nay. Tại sao không đăng nó như một câu trả lời? – Tyrsius

+0

Phải. Tôi sẽ thêm nó vào câu trả lời của tôi. –

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