2013-04-03 11 views
8

này đang làm việc:Sử dụng Twitter Bootstrap nút nhóm như đài phát thanh chọn với bindings loại trực tiếp

view.html

<div><input type="radio" name="radioPriority" data-bind="checked: priority" value="want" style="margin-top: -3px; margin-right: 3px;" />I want to</div> 
<div><input type="radio" name="radioPriority" data-bind="checked: priority" value="need" style="margin-top: -3px; margin-right: 3px;"/>I need to</div> 

controller.js

function feedbackViewModel() { 
    var self = this; 
    self.priority = ko.observable("want"); 
    //lots of other stuff 
} 

Đúng như dự đoán, khi bạn chọn radio thứ hai giá trị quan sát ưu tiên thay đổi thành "cần". Tuy nhiên, tôi muốn sử dụng nhóm nút Twitter Bootstrap làm đài. Dưới đây là HTML tôi có, nhưng nó không làm thay đổi quan sát được như mong đợi:

<span class="btn-group" data-toggle="buttons-radio"> 
    <button data-bind="checked: priority" type="button" class="btn" value="want">I want to</button> 
    <button data-bind="checked: priority" type="button" class="btn" value="need">I need to</button> 
</span> 

cập nhật Tôi có một jsfiddle sẽ ở đây: http://jsfiddle.net/a8wa8/6/ "priority1" là sẽ chọn đài phát thanh chuẩn và "priority2" là bootstrap nút.

Trả lời

9

Vấn đề là bạn đang sử dụng Checked ràng buộc với nút không được phép, thay vào đó bạn có thể sử dụng liên kết nhấp chuột. kiểm tra fiddle này:

http://jsfiddle.net/a8wa8/7/

Cập nhật:

Có bạn có thể đạt được điều này bằng cách sử dụng ko css binding. Kiểm tra fiddle cập nhật này:

Updated Fiddle

+0

Điều này hoạt động tốt ngoại trừ khi tôi thay đổi mô hình, nó không cập nhật chế độ xem. tức là, thiết lập priority2 ('muốn') thực dụng không chọn nút thích hợp. Điều này có dễ dàng thực hiện được không? –

+1

@ScottBeeson xin vui lòng kiểm tra câu trả lời cập nhật của tôi và cho tôi biết là những gì bạn muốn? – gaurav

+0

Hoàn hảo! Cảm ơn –

6

checked binding chỉ hoạt động với các điều khiển "có thể kiểm tra" như hộp kiểm (<input type='checkbox'>) hoặc nút radio (<input type='radio'>).

Nhưng bạn có button trong ví dụ thứ hai của bạn trong đó bootstrap chỉ mô phỏng giao diện của nhóm nút radio để liên kết checked không hoạt động.

Tuy nhiên bạn có thể sử dụng click binding nơi bạn vượt qua giá trị quan sát của bạn:

<span class="btn-group" data-toggle="buttons-radio"> 
    <button data-bind="click: function() { priority2('want') }" 
      type="button" class="btn" value="want">I want to</button> 
    <button data-bind="click: function() { priority2('need') }" 
      type="button" class="btn" value="need">I need to</button>  
</span> 

Và bạn có thể ẩn này đằng sau một tùy chỉnh ràng buộc:

ko.bindingHandlers.valueClick = { 
    init: function(element, valueAccessor, allBindingsAccessor, 
        viewModel, bindingContext) {  
     var value = valueAccessor(); 
     var newValueAccessor = function() { 
      return function() { 
       value(element.value); 
      }; 
     }; 
     ko.bindingHandlers.click.init(element, newValueAccessor, 
      allBindingsAccessor, viewModel, bindingContext); 
    }, 
} 

Sau đó, bạn có thể sử dụng nó như:

<span class="btn-group" data-toggle="buttons-radio"> 
    <button data-bind="valueClick: priority2" 
      type="button" class="btn" value="want">I want to</button> 
    <button data-bind="valueClick: priority2" 
      type="button" class="btn" value="need">I need to</button>  
</span> 

Demo JSFiddle.

+0

này cũng làm việc, mặc dù nó là phức tạp hơn nhiều so với câu trả lời Gaurav, nhưng nó có cùng một vấn đề. Nó không phải là một ràng buộc hai chiều. Nếu tôi đặt mức độ ưu tiên ('muốn') và mức ưu tiên2 ('muốn'), bạn sẽ thấy rằng đài được tự động chọn nhưng nút bootstrap thì không. –

+0

Nếu bạn cũng muốn có liên kết hai chiều thì bạn cần phải kết hợp 'click' với liên kết' css'. Trình liên kết tùy chỉnh 'valueClick' của tôi có thể được mở rộng để xử lý trường hợp này. Lúc đầu nó có vẻ phức tạp nhưng nó là giải pháp duy trì nhiều hơn nữa. Bởi vì trong câu trả lời được chấp nhận của bạn, bạn phải lặp lại "muốn" và "cần" 3 lần và "priority2" 2 lần trên các nút. Mặt khác với một ràng buộc tùy chỉnh bạn cần phải viết tất cả mọi thứ một lần. – nemesv

+0

@nemesv Duuuuude giải pháp của bạn là hoàn hảo cho những gì tôi cần. Cảm ơn, tôi sẽ cần phải mở rộng chức năng 'valueClick' để xử lý các ràng buộc hai chiều, như bạn đã nói, nhưng cho đến nay nó hoàn hảo. – Skytiger