2013-04-03 3 views
8

Dies funktioniert:Verwenden Twitter Bootstrap-Taste Gruppe als Radio mit Knockout-Bindungen wählen

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 
} 

Wie erwartet, wenn Wenn Sie das zweite Radio auswählen, ändert sich der Wert des Prioritätsbeobachtungsobjekts in "Bedarf". Ich möchte jedoch eine Twitter-Bootstrap-Schaltflächengruppe als Radio verwenden. Hier ist der HTML Ich habe, aber es ändert nichts an der beobachtbaren wie erwartet:

<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> 

Update Ich habe einen jsfiddle gehen hier: http://jsfiddle.net/a8wa8/6/ „Priority1“ ist die Standard-Radio wählt und „Priorität 2“ wird die Bootstrap Tasten.

Antwort

9

Das Problem ist, dass Sie Checked Bindung mit Schaltfläche verwenden, die nicht zulässig ist, stattdessen können Sie Klickbindung verwenden. überprüfen Sie diese Geige:

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

Aktualisiert:

Ja, Sie können dies erreichen, indem Sie ko css binding. Überprüfen Sie diese aktualisierte Geige:

Updated Fiddle

+0

Das funktioniert gut, außer wenn ich das Modell ändere, wird die Ansicht nicht aktualisiert. Dh, pragmatisch die Priorität 2 ('wollen') zu setzen, wählt nicht die entsprechende Schaltfläche aus. Ist das leicht machbar? –

+1

@ScottBeeson überprüfen Sie bitte meine aktualisierte Antwort und lassen Sie mich wissen, ist das, was Sie wollen? – gaurav

+0

Perfekt! Danke –

6

Die checked binding funktioniert nur mit "Checkable" -Steuerelementen wie Kontrollkästchen (<input type='checkbox'>) oder einem Optionsfeld (<input type='radio'>).

Aber Sie haben button in Ihrem zweiten Beispiel wo Bootstrap emuliert nur das Aussehen der Radiobutton-Gruppe, so dass die checked Bindung funktioniert nicht.

auch immer Sie die click binding verwenden können, wo Sie den Wert auf Ihre beobachtbare passieren:

<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> 

Und Sie können diese Bindung hinter einem benutzerdefinierten verbergen:

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); 
    }, 
} 

Dann können Sie es verwenden möchten:

<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

Dies funktioniert auch, obwohl es wesentlich komplexer ist als gaurav Antwort, aber es hat das gleiche Problem. Es ist keine Zwei-Wege-Bindung. Wenn ich priority ('will') und priority2 ('will') setze, wird das Radio automatisch ausgewählt, aber der Bootstrap-Button nicht. –

+0

Wenn Sie auch die Zwei-Wege-Bindung haben wollen, dann müssen Sie den 'click' mit der' css'-Bindung kombinieren. Mein 'valueClick'-Custom-Bindinghandler kann erweitert werden, um auch diesen Fall zu behandeln. Am Anfang mag es kompliziert erscheinen, aber es ist eine viel aufrechterhaltbare Lösung. Denn in Ihrer angenommenen Antwort müssen Sie dreimal "wollen" und "müssen" und "priority2" zweimal auf den Tasten wiederholen. Auf der anderen Seite mit einer benutzerdefinierten Bindung müssen Sie alles einmal schreiben. – nemesv

+0

@nemesv Duuuuude Ihre Lösungen sind perfekt für das, was ich brauche. Danke, ich muss die Funktionalität von "valueClick" erweitern, um die Zwei-Wege-Bindung zu handhaben, wie Sie sagten, aber bis jetzt ist es perfekt. – Skytiger

Verwandte Themen