2013-08-22 13 views
19

Die JavaScript page for Bootstrap zeigt einige nette Verwendung von Schaltflächen zum Ankreuzen von Kontrollkästchen und Radio-Felder. Zum Beispiel für eine Checkbox, könnte ichBootstrap Kontrollkästchen/Radio-Tasten ändern nicht Wert

<div class="btn-group" data-toggle="buttons"> 
    <label class="btn btn-primary"> 
    <input type="checkbox"> Option 1 
    </label> 
</div> 

jedoch schreiben, wird die Bibliothek nicht tatsächlich den Wert des zugrunde liegenden <input> Feldes ändern - es ändert sich nur, ob die <label> Feldklasse active. Ich hätte erwartet, dass es das checked Attribut auf der Checkbox ändert. Anscheinend habe ich es nicht falsch konfiguriert - so funktionieren die Beispiele auf der Bootstrap-Seite.

Ist das tatsächlich erwartetes Verhalten? Wenn dem so ist, scheint es ziemlich nutzlos, da die Leute das Kontrollkästchen verwenden wollen. Wenn nicht, wie konfiguriere ich Bootstrap Checkboxen/Radio Buttons richtig?

+1

Im Moment ändern sie es nicht für echte ... https://github.com/twbs/bootstrap/issues/14137 – Kolyunya

+0

Hinzufügen eines Attributs "Name" ermöglicht die Kontrollkästchen Daten POSTED, wenn Sie das sind Hoffe auf. – Mashakal

Antwort

34

Das checked Attribut auf den Eingang nicht geändert wird, weil das nicht das, was sich ändert, wenn ein Kontrollkästchen Eingabe überprüft wird - die checked DOM-Eigenschaft ist, welche Änderungen (wahr oder falsch), und Bootstrap behandelt dies richtig (Sie können das Element in Firebug untersuchen und die DOM-Eigenschaft ändern, wenn Sie sie umschalten). Das Attribut checked wird nur verwendet, um den Standardwert zu bestimmen, wenn das DOM zum ersten Mal gerendert wird.

Dies ist kein spezielles Verhalten für Bootstrap-Buttons, so funktionieren alle Checkboxen/Radios.

Edit: Firebug screenshot

+1

Interessant! Ich hatte diesen Unterschied vorher nicht bemerkt. – jameshfisher

+17

@jameshfisher Wenn Sie jemals eine js/jQuery mit Checkboxen/Radios tun, denken Sie daran! Wenn Sie ein Kontrollkästchen oder Optionsfeld programmatisch aktivieren müssen, wird $ ('input') .attr ('checked', 'checked'); 'die Aufgabe nicht erledigen. '$ ('input'). prop ('checked', true);' ist was du brauchst. – tomaroo

+0

@tomaroo Dein Kommentar oben rettete mich von 3 Tagen Haare ziehen. benutzte '$ ('input'). attr ('checked', 'checked');' anstelle von '$ ('input'). prop ('checked', true);'. Lebensretter! – suo

2

Es sieht so aus, als ob Sie einen Anruf zum "Aktivieren" der btn-group (documentation) verpassen. Hier ist a demo dieser Arbeits:

<form id='testForm'> 
    <div class="btn-group" data-toggle="buttons"> 
     <label class="btn btn-primary"> 
      <input type="checkbox" name='Option' value='1' />Option 1</label> 
    </div> 
</form> 
<button class='btn' id='actionSubmit'>Submit</button> 

<script> 
    $('#actionSubmit').on('click', function (e) { 
     e.preventDefault(); 
     alert($('#testForm').serialize()); 
    }); 

    $('.btn-group').button(); 
</script> 
+1

Eigentlich ist das nicht nötig. Die Datenattribute lösen die Bibliothek selbstständig aus. Entfernen Sie die letzte Zeile von JS in Ihrer Demo ('$ ('. Btn-group'). Button()') und es funktioniert immer noch. – colllin

1

ich es so für MVC.NET falls jemand tue es braucht:

@{  
    var removeSelected = Model.Remove == true ? "active" : ""; 
    var buttonText = Model.Remove == true ? "Add" : "Remove"; 

} 

    @Html.HiddenFor(model => model.Remove) 
    <div class="editor-field"> 
     <div class="btn-group" data-toggle="buttons-checkbox"> 
       <button type="button" id="RemoveButton" class="btn btn-primary @removeSelected" onclick="toggle();">@buttonText</button> 
     </div 
    </div> 


function toggle() { 
      var value = $("#Remove").val(); 
      if (value == "False") { 
       $("#Remove").val("True"); 
       $("#RemoveButton").text("Add"); 
      } 
      else { 
       $("#Remove").val("False"); 
       $("#RemoveButton").text("Remove"); 
      }    
     } 

Und schließlich nicht zu vergessen die Bootstrap-js refence hinzuzufügen.